Vor*_*rac 19 c++ iterator c++14
Scott Mayers的"Effective STL"第26项被标记为"Prefer iteratorto const_iterator,reverse_iteratorand const reverse iterator".
原因在于某些形式的insert()并且erase()要求完全iterator和从其他类型转换是乏味且容易出错的.此外,根据STL实施,比较iterator并且const_iterator可能存在问题.
这本书是在2001年发布的.第26项中的建议是否仍然适用于当前的gcc状态?
T.C*_*.C. 19
C++ 14标准(N3936)保证iterator并且const_iterator可以自由比较(§23.2.1[container.requirements.general]/p7):
在表达式中
Run Code Online (Sandbox Code Playgroud)i == j i != j i < j i <= j i >= j i > j i - jwhere
i和j表示容器iterator类型的对象,其中一个或两个可以由容器const_iterator类型的对象替换, 引用相同的元素而不改变语义.
此外,容器成员函数采用const_iteratorC++ 11中的参数(§C.2.13[diff.cpp03.containers] - 可能从标记中推断出来,这是对C++ 03的更改):
更改:签名更改:从
iterator到const_iterator参数理由:过度规范.效果:下列成员函数的签名从服用改变
iterator到服用const_iterator:
insert(iter, val)为vector,deque,list,set,multiset,map,multimapinsert(pos, beg, end)为vector,deque,list,forward_listerase(iter) for设置,multiset,地图,multimap`erase(begin, end) for设置,multiset,地图,multimap`- 各种形式的
list::splice- 各种形式的
list::merge
容器需求已经类似地更改为使用const迭代器.此外,std::reverse_iterator通过其.base()成员函数很容易获得底层迭代器.因此,问题中提到的问题都不应该成为符合标准的编译器中的问题.
从即将出版的Effective Modern C++的第13项中可以看出,这个建议已被颠倒过来,其标题为:
首选const_iterators到迭代器
原因是C++ 11和C++ 14添加了一些const_iterators更实用的调整:
C++ 11补充道
cbegin()和cend()(及其反向对应项)insert(),erase())现在来const_iterator代替的iteratorC++ 14通过添加非成员cbegin()和cend() (和他们的反向对应物)来完成
| 归档时间: |
|
| 查看次数: |
784 次 |
| 最近记录: |