NashZhou

广告算法工程师,目前致力于关键词广告的效果自动优化

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的容器多线程读写安全

 

posted on 2012-07-20 15:05  NashZhou  阅读(161)  评论(0编辑  收藏  举报

导航