2.9学习

1、unorder_map是通过哈希表实现,相对map通过红黑树实现,unorder_map查找的效率更高,但是如果好多键值通过哈希函数得到的都是一个值(极端情况),那查找效率就会降低
unorder_map和unorder_set本质上相同,都是哈希表实现,不过unorder_set中key就是value
2、SGI STL有2个内存分配方式,当用户需要的区块>128时用第一个内存分配方式(直接开辟释放内存),如果<128,就去链表的空隙处查找是否有内存块
3、heap是vector的一种数据管理方法,heap可以把vector中的元素排列成堆(二叉树),封装了特殊的方法进行插入和删除元素,不支持遍历

点击查看代码
vector<int> vec = {3,1,4,1,5,9};
make_heap(vec.begin(), vec.end());
4、vector中erase是可以直接删除元素,而remove()是通过algorithm将元素移植到容器最后面,还可以用迭代器删除,size()返回容器中元素个数,capacity()返回容器的实际大小 5、STL中allocate是STL的内存管理 6、迭代器遍历时范围一般是[begin(),end())和[rbegin(),rend())
点击查看代码
//将2和7位置的元素拷贝到list中
	ostream_iterator<int>ost(cout, " ");
	vector<int>vv = { 0,1,2,3,4,5,6,7,8 };
	copy(vv.begin(), vv.end(), ost);
	cout << endl;
	//手动定位到区间的起始迭代器,然后转化为反向迭代器,当然反向迭代器的指向也改变了
	//begin指向2,end指向7,转换完rbegin指向6,ren指向1
	auto r_begin = vector<int>::reverse_iterator(vv.begin() + 7);
	auto r_end = vector<int>::reverse_iterator(vv.begin() + 2);

	list<int>ll;
	copy(r_begin, r_end, back_inserter(ll));//反向迭代器用back_inserter
	copy(ll.begin(), ll.end(), ost);
7、map的使用个例,读取一段文字,用map记录所有单词分别出现过的行数
点击查看代码
ifstream fst("test.txt");
	if (!fst)
	{
		cout << "test打开失败" << endl;
		return 1;
	}
	//将字符串和它所在行绑定
	map<string, list<int>>word_line;
	string wordsLine;//一行的单词
	string word;//读取的单个单词
	int number_line = 0;
	while (getline(fst, wordsLine))
	{
		number_line++;
		istringstream l_in(wordsLine);
		while (l_in >> word)
		{
			word_line[word].push_back(number_line);
		}
	}
posted @ 2026-02-09 14:12  dd_l  阅读(3)  评论(0)    收藏  举报