Effective STL学习总结一(1-5)
kejieleung
第1条:慎重选择容器类型
标准STL序列容器:vector, string, deque 和 list
标准STL关联容器:set, multiset, map, multimap
非标准STL关联容器:hash_set, hash_multiset, hash_map, hash_multimap
选择的要点无非是实际应用中具体要求:是否要有序?是否需要经常加入,删除?随机访问等。
第2条:不要试图编写独立于容器类型的代码
虽然不同容器有类似的操作,如push_back, insert等,但不同的容器会有很多细节上的不同处理,所以最好不要以一种统一的方法使用vector或list之类。如果要从vector转到使用list, 也要认真检查每步相关的操作
可以使用typedef来分离
typedef vector
typedef vector
不仅使用时可以少打代码,切换也方便!
书中还建议自己封装
class CustomVector
{
private:
typedef vector
typedef vector
CustomerContainer customers;
public:
...
};
第3条:确保容器中的对象拷贝正确而高效
Stl做了很多的拷贝,但它总的设计思想是为了避免不必要的拷贝。事实上它的总体设计目标是为了避免创建不必要的对象。
创建对象数组:
Widget w[ max_num ]; //一次过创建这么多个对象
vector
第4条:调用empty而不是检查size()是否为0
通常会认为:
If( c.size() == 0 ) 与
If( c.empty ) 相同
但是,empty是对于所有标准容器来说是常数时间的,而size() 在list的实现中可能线时间的!
第5条:区间成员函数优先于与之对应的单元素成员函数
相关操作函数
assign
v1.assign(v2.begin() + v2.begin()/2, v2.end() );
insert
v1.insert( v1.end(),v2.begin() + v2.begin()/2, v2.end() );
copy
copy( name.begin(), name.end(), ostream_iterator
erase
iterator container::earse( iterator begin, iterator end ); //序列容器
void container::earse( iterator begin, iterator end ); //关联容器
显式写循环效率低下,而且很我不必要的构造函数调用,数据拷贝,移动:
vector
for( int i=0; i< numValues; ++i )
{
insertLoc = v.insert( insertLoc, data[i] );
++insertLoc; //即使每次都是从最后插入,效率上仍然比不上区间insert(当超出长度时有移动多次,区间insert只移动一次。
}
改成使用区间insert:
name.insert( name.begin(), data + 1, data + MAX_LEN - 1); //会更高效(快一倍)
这样做的好处有:
(1) 区间成员函数写起来更方便(不用显式写循环)
(2) 更能清楚的表达你的意图
(3) 它们表现出一更高的效率(如插入,一次过预留要插入的空间数,而不会每插入一次改变一次)
测试代码如下,相差非常大!!
#include