1.容器
2016-07-11 15:45
183 查看
Effective STL—容器
Item01
慎重选择容器类型
基于节点的容器指针,引用变为无效的次数少,正在删除的元素指向除外,如list。
Item02
不要试图编写独立于容器类型的代码
不同的容器特性不一样
迭代器失效的规则也不一样
可以采用typedef vector< Widget > widgetContainer类型定义的方式,减少改动的代码。
Item03
确保容器中的对象拷贝正确而高效
将子类型对象存入基类型容器时,子类特有的部分将会消失。
Item04
调用empty而不是检查size()是否为0
empty对于所有的标准容器都是常数时间操作,而对一些list实现,size耗费线性时间。
Item05
区间成员函数优先于与之对应的单元素成员函数
区间创建:T obj( beg , end )
区间插入:obj.insert( pos , beg , end )
区间删除:obj.erase( beg , end )
区间赋值:obj.assign( beg , end )
优势:
写起来容易
更易理解,意图明确,便于扩展
效率高
Item06
当心C++编译器最烦人的分析机制
Widget w(); //函数声明而非默认构造,c++11中可以通过Widget w{}默认构造
int f(double d); //函数声明 int f(double (d)); //围绕参数名的括号被忽略 int f(double); //形参名可以去除
int g(double(*pf)()); //函数声明 int g(double pf()); //隐式指针 int g(double ()); //省去参数名,独立的括号则表明参数列表
可以通过非临时对象的形式表示
4000
Item07
如果容器中包含了通过new操作创建的指针,切记在容器对象析构前将指针delete掉
可用智能指针来处理,即使在异常情况下也不用害怕
Item08
切勿创建包含auto_ptr的容器对象
因为auto_ptr的复制意味着所有权的移交,所以当进行sort时会导致成员的失效。
Item09
慎重选择删除元素的方法
①删除特定值的所有对象
vector,string,deque erase-remove习惯用法:v.erase(remove(v.begin(),v.end(),5),v.end());list list::remove
标准关联容器 erase成员函数
②删除满足条件的所有对象
vector,string,deque erase_remove_iflist list::remove_if
标准关联容器 remove_copy_if到一个临时空间,再swap或者写一个循环来遍历容器中的元素,以后缀迭代器传给erase
③循环内部的注意点
序列容器每次调用erase时,要用它的返回值更新迭代器for(auto i = v.begin();i!=v.end();;) { if(need_delete(*i)) i = v.erase(i); else ++i; }
关联容器以后缀传给erase
for(auto i = a.begin();i!=a.end();;) { if(need_delete(*i)) a.erase(i++); else ++i; }
Item10
了解allocator的约定和限制
由于光靠T无法配置list的alloc,所以要重绑使之可以按ListNode< T >进行内存分配
Item11
理解自定义allocator的合理用法Item12
切勿对STL容器的线程安全性有不切实际的依赖
必须手工做同步控制,也可以用{}将代码段包围,开始时用RAII技术来使用Lock类
相关文章推荐
- [Tjoi2016&Heoi2016]序列
- hdu-3938-Portal-并查集
- Android中Recyclerview使用2----实现添加删除条目时加动画
- Mysql数据库语句大全
- iOS开发笔记--使用blend改变图片颜色
- iOS 怎么设置 UITabBarController 的第n个item为第一响应者?
- Redux状态管理方法与实例
- 41. 这张表lbdeveloplog可以查看各个对象的提交情况,包括是哪个IP提交的
- swift学习笔记
- Docker构建并测试Web应用程序
- 数据库语法
- Java NIO介绍
- delegate绑定多个事件
- DirectWrite文字排版——字符串去尾
- http返回压缩包解压
- 红楼梦命名的艺术
- 关于python的PE库pefile
- linux课堂笔记----磁盘管理
- NAND Flash的坏块
- 易语言屏蔽优酷广告代码