STL学习(四)阶段简单总结

来源:互联网 发布:7723java游戏 编辑:程序博客网 时间:2024/09/21 09:25

特别注意
1.在使用容器的时候,最好不要自己写循环

deque
deque也采用动态数组来管理内存,而且动态数组头尾都开放,操作上也与vector几乎一样。下面是与vector相比不同的地方。
1.在存取元素的时候,deque的内部结构会多一个间接过程,所以元素的存取和迭代器的动作会稍微慢一些。
2.deque可以内含更多元素,因为它使用不止一块内存,因此deque的max_size可能更大。

set
1.使用set.lower_bound(elem)的时候最好先判断elem是否在set内,如果是upper_bound(elem),如果这个elem是最后一个元素,那么会返回一个无意义的数值。
2.set使用红黑树来实现,使用set自己的find函数效率比STL算法的find效率要高很多。

vector
1.++vector和--vector不能有效的使用。

function object
1.当容器重视对象实体时候用mem_fun_ref,容器中是对象指针的时候用mem_fun

algorithms
1.尾词_if一般带尾词的最后一个参数为仿函数,而不带尾词的为值,如find()和find_if()。_copy带尾词的一般会复制到目标区间

序列式容器与关联式容器的erase()函数返回值不同:
序列容器提供的erase()成员函数如下:
iterator erase(iterator pos);
iterator erase(iterator beg, iterator end);
关联式容器的erase()容去成员函数如下:
void erase(iterator pos);
void erase(iterator beg, iterator end);
        存在这种差别完全是为了性能。在关联式容器中,底层是以二叉树来实现的,“搜寻某元素并后回后继”元素可能颇为耗时。如果写对所有容器都适用的代码,必须忽略返回值。

发现问题(SGI STL与PJ STL不同之处,在vc上无法编译,在suse10上可以编译运行)
1.《C++标准程序库》p210——在使用make_pair来添加multimap<string, string> StrStrMMap的时候,如果直接用StrStrMMap.insert("abc", "def"),虽然编译过程不会出错,但用iterator访问的时候就会出错,初始化的时候改成StrStrMMap.insert(string("abc"), string("def"))就不会出错。
2.《C++标准程序库》p187——set的构造函数,在vc6.0中没有自动改变排序准则的构造函数。不能把一个降序的set构造一个升序的set。(SUSE中使用ostream_iterator要包含iterator头文件)
3.《C++标准程序库》p309:“被const_fun_ref和const_fun调用的成员函数必须是const,C++标准库不针对non-const成员函数提供函数配接器”,但VC6.0中const成员函数编译不会通过,反而non-const成员函数通过编译并运行,而且msdn上的例子也是支持的non-const成员函数。
4.《C++标准程序库》p308:for_each(coll.begin(), coll.end(),bind2nd(mem_fun_ref(&Person::printWintPrefix),"person: "));编译不通过。

原创粉丝点击