Effective STL总结

1. 条款1 仔细选择你的容器

*标准STL序列容器:vector string deque list
*标准STL关联容器:set mulist map multimap
*非标准关联容器:hash_set hash_multiset hash_map hash_multimap
vector string和deque也被称为标准的连续内存容器(连续内存容器(也叫做基于数组的容器)在一个或多个(动态分配)的内存块中保存它们的元素。如果一个新元素被插入或者已存元素被删除,其他在同一块内存的元素就必须向上或者向下移动来为新元素提供空间或者填充原来被删除的元素的空间)
基于节点的容器在每个内存块中只保存一个元素。容器元素的插入和删除只影响指向节点的指针。而不是节点自己的内容。故当有元素插入或者删除时,容器中的元素不需要移动。该类型的容器有list、slist、标准关联容器(平衡树)。

vector、deque、list选择方案:
1.vector可以作为一种默认使用的序列类型
2.当很频繁地对序列中部进行插入和删除时应该用list
3.当大部分插入和删除发生在序列的头或尾时可以选择deque数据结构

3.使容器里对象的拷贝轻量而正确

当你向容器中添加一个对象(如通过insert或push_back等),添加到容器里面的时你指定对象的拷贝。拷进啦,拷出去,这是STL的方式。如果你用一个拷贝过程很昂贵对象填充一个容器,那么把对象放进容器也会是一个性能瓶劲。容器中移动越多的东西,你就会在拷贝上浪费越多的内存和时钟周期。
由于继承的存在,拷贝会导致分割。那就是说,如果以基类建立一个容器,而当你试图插入派生类对象,那么当对象(通过基类的拷贝构造函数)拷入容器的时候对象的派生部分会被删除。

vector<Widget>vw;
class SpecialWidget;// SpecialWidget从Widget派生
public Widget{...};
SpecialWidget sw;
vm.push_back(sw); // sw被当作基类对象考入vw 当拷贝时sw的特殊部分将被丢失

一个使拷贝更加高效。正确而且对分割问题免疫的简单的办法是建立指针的容器,但是指针容器仍然有令人头疼的问题,智能指针容器是一个吸引人的选择。

4.用empty来代替检查size()是否为0

对于任意容器c,if(c.size() == 0)与if(c.empty())等价。因为对于所有的标准容器,empty是一个常数时间的操作,但是对于一些list实现,size花费线性时间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值