2.11学习

1、STL的hashtable的本质是一个vector的哈希桶,桶的数量一直是质数,当需要扩容的时候就还是质数,每个哈希桶中都储存着一个双向链表,这样,如果有两个不同的元素通过哈希函数得到同一个哈希桶的值,那么这两个元素就储存在双向链表中,这样做是为了防止哈希冲突
如果桶中的链表长度超过了预定的阈值,这个数据结构就会转化为红黑树
2、vector进行扩容时会先把当前内存释放,然后把之前的内容进行迁移到一块更大的内存中,size()是现有元素个数,capicity()是容器的大小,resize()是指定元素的个数,可能会造成元素的构造和销毁,而reserve是会开辟内存,不会构造函数
3、vector的内存释放

点击查看代码
vector<int>vv;
	//释放内存
	vv.clear();//清空内存
	vv.shrink_to_fit();
	//直接清空内存并返回一个空vector
	vector<int>().swap(vv);
4、upper_bound,lower_bound,equal_range三种查找,本质是二分查找,前提是序列必须是有顺序的 比如一个序列1,2,3,3,3,3,4,5,使用upper_bound查找就会返回索引2的位置 lower_bound会返回索引5的位置,equal_range会返回一个pair,first指向第一个3的位置,second指向最后一个3的位置,正好是upper_bound和lower_bound集合
点击查看代码
void print_map(const multimap<string,string>&author_books)
{
	for (auto temp : author_books)
	{
		cout << temp.first << " " << temp.second << endl;
	}
}
void remove_books(multimap<string, string>&author_books,const string&name)
{
	auto position = author_books.equal_range(name);//返回一个pair<>
	if (position.first == position.second)
		cout << "没有这个作者" << endl;
	else
		author_books.erase(position.first, position.second);
}
multimap<string, string>author_books;//作者+书名
	author_books.insert(make_pair("A", "高等数学"));
	author_books.insert(make_pair("A", "线性代数"));
	author_books.insert(make_pair("A", "概率论"));
	author_books.insert(make_pair("B", "数据结构"));
	author_books.insert(make_pair("B", "计组"));
	author_books.insert(make_pair("B", "计网"));
	author_books.insert(make_pair("C", "焊接冶金"));
	author_books.insert(make_pair("C", "无损检测"));
	print_map(author_books);
	remove_books(author_books, "B");
	print_map(author_books);

posted @ 2026-02-12 00:22  dd_l  阅读(8)  评论(0)    收藏  举报