写C++程序无可避免的会使用到STL,好的,这并不困难,需要记住的就是:
1.多线程程序使用LOCK来同步访问;
2.在手工循环中避免迭代器失效(注意调用链上可能产生副作用)
而且到目前为止用的最多的就是list和map,只是想要让程序实现功能的话就无非这样就可以了。
但是STL包含的内涵显然要多很多,为了编写出更漂亮的代码,需要多考虑一些东西:
1.使用算法优先于手工循环,这样可能效率更高,并且减少出错。
.list和map很好,经常够用了。但是有理由需要使用其他的序列容器。首先list不提供随机迭代器,这样导致相应的算法效率低下。
.为不同的容器选择合适的操作步骤。
.copy等算法并不是insert操作,而是assign操作, 因此它访问的迭代器需要解引用,也就是说,目标容器应该事先有相应的大小(说的是size,而不是capacity)。
.连续内存容器(vector, string, dequeue)应该在初始化的时候给出适当的大小。内存分配是非常“重”的工作,尽可能避免。
.vector的reserve并不会插入相应的默认元素,它只是要求相应的内存,也就是说它改变了capacity,但是没有改变size,如果之前容器是 empty的,那么它仍然会是empty的。
.使用区间操作优先于单元素操作,和条款1实质相同,避免手工循环,而是用更加高效的做法。
.算法要求的仿函数类应该都是:值传递的纯函数类。使用引用参数实例化模板根本编译不过,而C++标准要求算法需要的仿函数类都应该是纯函数类。
.成员函数优先于非成员函数的算法。因为非成员函数的算法无法得知实现细节,因为无法进行优化。抽象是需要代价的。
.性能关键的时候,inline了的函数类算子比函数指针要高效的多,因为编译器无法对函数指针进行inline操作,即使那个函数是inline的。
.使用高级的I/O,标准C++的I/O设计和STL是紧密结合的,istream_iterator和ostream_iterator将输入输出流视为容器的抽象。高级的抽象下,代码漂亮许多。
.你所要知道的头文件:
algorithm, numeric, functional, iterator