Scott Mayers的“有效STL”第26项标记为“首选iterator
至const_iterator
,reverse_iterator
和const reverse iterator
”。
原因是某些形式的insert()
和erase()
完全需要iterator
,而从其他类型转换是单调且容易出错的。此外,根据STL实施情况,比较iterator
和const_iterator
可能会有问题。
该书于2001年发布。第26项中的建议对gcc的当前状态是否仍然有效?
答案 0 :(得分:18)
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
其中
i
和j
表示容器的iterator
类型的对象, 其中一个或两个可以被容器的对象替换const_iterator
类型引用相同的元素而没有变化 语义。
此外,容器成员函数从C ++ 11开始接受const_iterator
参数(§C.2.13[diff.cpp03.containers] - 可能从标记中推断出来,这是对C的更改) ++ 03):
更改:签名更改:从
iterator
到const_iterator
参数理由:过度指定。 效果:以下成员函数的签名从执行
iterator
变为了const_iterator
:
- {li>
insert(iter, val)
代表vector
,deque
,list
,set
,multiset
,map
,multimap
insert(pos, beg, end)
vector
,deque
,list
,forward_list
erase(iter) for
集合,
{多重集{1}} {地图{1}} multimap`,
集合,
{多重集{1}} {地图{1}} multimap`- 所有形式的
erase(begin, end) for
- 所有形式的
,
容器需求已经类似地更改为采用const迭代器。此外,通过,
成员函数很容易从,
获取底层迭代器。因此,问题中提到的问题都不应成为符合标准的编译器中的问题。
答案 1 :(得分:7)
建议已被颠倒过来,正如即将出版的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()
(以及他们的反向对应物)来完成