STL的那些痛心事
1.伤不起的erase
用erase可以删除vector里的元素,但是就像我们自己定义的单链表一样,删除结点后,需要重新拼接。
原以为erase(it)过后,it就会自动指向下一个元素。事实上我们需要it=erase(it)才行。于是就有了it ++ 不能放到for里面的原因。
关于end()的动态变化比较难理解。总之现在,我一般都新建一个vector,把需要的添加到这里。然后 最后赋值就行了。
2.set
set的iterator是加了const的,不能用iterator来删除元素。
3.const容器与const迭代器
const 容器的迭代器要用const的。容器里面有两种iterator。
4.还是const
一个函数比如fun(const vector<int> & vec_word, vector<int>::iterator it)
即便it没有加const,如果这个it是传入的vec_word的迭代器的话,那么通过it是不能修改vec_word的值的。
也就是说前面的const vector<int> & vec_word已经加了const保险,能影响到所有对vec_word在本函数中的操作。
哪怕你通过其它传参把vec_word的某些东西传递过去。
5. IO对象不可复制或赋值
曾试过把ofstream类型不可存储在vector容器中。(IO是流对象,而流对象是不能复制的,所以不能存储在vector容器中)
后来 用FILE* 替代了。
6.Algorithm里的sort算法
通常的做法是自己定义一个比较器,这个比较器定义的位置 不能错,还有一个方法 是重载<运算符
7.内存回收
vector的回收可用用swap,那map呢,要么用指针,要么key与value分开放。
在STL与OS之间还有个glibc,所以即便从allocator入手,也不能完全掌控。此外还有STL的容器多线程读写安全