栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C++】Effective STL:50条有效使用STL的经验:二十六至二十九

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C++】Effective STL:50条有效使用STL的经验:二十六至二十九

第二十六条:iterator优先于const_iterator、reverse_iterator及const_reverse_iterator。
原因:
1)容器中的instert和crase函数的形参只接受iterator类型,不接受const_iterator、reverse_iterator及const_reverse_iterator。
2)从iterator到const_iterator,或者从reverse_iterator到const_reverse_iterator之间都存在隐式转换,但是反过来技术上可以实现,但不推荐,效率不能保证。
3)在同一个表达式中混用iterator和const_iterator,比如比较操作,会发生隐式转换,有时会出现问题。

第二十七条:使用distance和advance将容器的const_iterator转换成iterator
distance:用于取得两个迭代器之间的距离;
advance:用于将一个迭代器移动指定的距离。

typedef deque IntDeque;
typedef IntDeque::iterator Iter;
typedef IntDeque::const_iterator ConstIter;

IntDeque d;
ConstIter ci;
...
Iter i(d.begin()); /迭代器 i 指向容器 d 起始位置
advance(i, distance(i, ci)); /注意这里指明distance所使用的类型为ConstIter

效率问题:对于随机访问的迭代器(如vector、string、deque产生的迭代器)而言,执行时间是常数时间;对于其他标准容器以及散列表的迭代器而言,执行时间是一个线性时间,因此推荐二十六条,尽量用iterator代替const_iterator

第二十八条:正确理解由reverse_iterator的base()成员函数所产生的iterator的用法
1)插入操作:如果要在一个迭代器reverse_iterator ri指定的位置上插入一个新元素,则只需在ri.base()位置处插入元素即可。
2)删除操作:如果要在一个迭代器reverse_iterator ri指定的位置上删除一个元素,要先递增ri,然后在调用base()函数,例如:v.erase((++ri).base());

第二十九条:对于逐个字符的输入请考虑使用istreambuf_iterator
对比istream_iterator,它在默认请看下会跳过空白字符,并且效率低。
读取一个文本文件的内容到一个string对象中,推荐的方案如下:

ifstream inputFile("test.txt");
string fileData((istreambuf_iterator(inputFile)), 
				 istreambuf_iterator());
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/289908.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号