[Effective STL] 容器

慎重选择容器的类型

标准序列容器:vector,string,deque,list
标准关联容器:set,multiset,map,multimap
非标准序列容器:slist(单向链表),rope(重型string)
非标准的关联容器:hash_set,hash_multiset,hash_map,hash_multimap
标准的非STL容器:数组,bitset,valarray,stack,queue和priority_queue

1、如果需要在容器任意位置插入新元素,则考虑序列容器,关联容器做不到
2、如果不关心容器中的元素有排序关系,则哈希容器是一个可行的选择方案,否则,避免哈希容器。
3、如果你选择随机访问的迭代器,则对容器的选择限定为vector、deque、string。如果选择双向迭代器,那么你必须避免slist以及哈希容器的一个常见实现。
4、当发生容器中元素插入、删除操作,避免移动容器中原来的元素是否很重要?如果是,就要避免连续内存的容器。
5、如果元素查找速度是关键因素?如果是,就要考虑哈希容器、排序的vector和标准关联容器。
6、如果容器内部使用了引用计数,如果介意的话,则避免使用string,因为许多string的实现都使用了引用计数。
7、对插入和删除操作,你需要事务语义吗?也就是说在插入失败和删除的情况下,你需要回滚的能力吗?如果需要,你就要使用基于节点的容器。如果对于多个元素的插入需要事务语义,则需要使用list。
8、如果需要使迭代器、指针和引用变为无效的的次数最少,就要使用基于节点的容器。
9、如果序列容器的迭代器是随机访问类型,而且只要没有删除操作发生,且插入操作只发生在容器的末尾,则指向数据的指针和引用就不会变为无效。

不要试图编写独立于容器类型的代码

确保容器中的对象拷贝正确而高效

容器遵循(copy in,copy out)的原则,但在c++11可以用emplace_back进行原地构造元素,而不需要先构造再复制的过程,其中省略了一次复制过程。
STL的实际目标是为了避免创建不必要的对象。

Widget 	w[maxNumWidgets];//创建了有maxNumWidgets个widget的数组
                         //每个对象都使用了默认构造函数来创建
std::vector<Widget> vw;
vw.reserve(maxNumWidgets);//创建了足够空间来容纳maxNumWidgets个对象,但并没有创建任何一个widget对象。

调用empty而不是检查size()为0

empty对所有标准容器都是常数时间操作,而一些list实现,对于size是耗费线性时间(其中涉及到list的链接问题,如果链接操作时常数时间,则size是线性时间,反之亦然)。

区间成员函数优先于与之对应的单元素成员函数

当你需要完全替换一个容器的内容是,你应该想到赋值。如果你想把一个容器拷贝到相同类型的另一个容器,那么operator = 是可选择的赋值函数。但当你想给容器一组全新的值时,你可以使用assign,而operator=则不能满足你的要求。

v2.assign(v1.begin()+v1.size()/2,v1.end());//100分写法

v2.clear();
copy(v1.begin()+v1.size()/2,v1.end(),back_inserter
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值