在C++ 14中,const迭代器是否仍然是邪恶的

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):

在表达式中

i == j
i != j
i < j
i <= j
i >= j
i > j
i - j
Run Code Online (Sandbox Code Playgroud)

where ij表示容器iterator类型的对象,其中一个或两个可以由容器const_iterator类型的对象替换, 引用相同的元素而不改变语义.

此外,容器成员函数采用const_iteratorC++ 11中的参数(§C.2.13[diff.cpp03.containers] - 可能从标记中推断出来,这是对C++ 03的更改):

更改:签名更改:从iteratorconst_iterator参数

理由:过度规范.效果:下列成员函数的签名从服用改变iterator到服用const_iterator:

  • insert(iter, val)vector,deque,list,set,multiset,map,multimap
  • insert(pos, beg, end)vector,deque,list,forward_list
  • erase(iter) for设置,multiset ,地图,multimap`
  • erase(begin, end) for设置,multiset ,地图,multimap`
  • 各种形式的 list::splice
  • 各种形式的 list::merge

容器需求已经类似地更改为使用const迭代器.此外,std::reverse_iterator通过其.base()成员函数很容易获得底层迭代器.因此,问题中提到的问题都不应该成为符合标准的编译器中的问题.

  • 你应该明确提到这是从C++ 03 - > C++ 11的变化. (3认同)

Tem*_*Rex 8

从即将出版的Effective Modern C++的第13项中可以看出,这个建议已被颠倒过来,其标题为:

首选const_iterators到迭代器

原因是C++ 11和C++ 14添加了一些const_iterators更实用的调整:

C++ 11补充道

  • 所有标准库容器的成员函数cbegin()cend()(及其反向对应项)
  • 使用迭代以确定位置的成员函数(例如insert(),erase())现在来const_iterator代替的iterator

C++ 14通过添加非成员cbegin()cend() (和他们的反向对应物)来完成