10

对于大多数容器,iterator类型提供对容器中值的读写访问,而const_iterator类型提供只读访问。但是,对于std::set<T>,迭代器类型不能提供读写访问,因为修改集合中的值(可能)会破坏容器不变量。因此,在std::set<T>iterator和中都const_iterator提供只读访问。

这引出了我的问题:你可以用 a 做std::set<T>::iterator的事情和你可以用 a 做的事情之间有什么区别std::set<T>::const_iterator吗?

请注意,在 C++11 中,容器的操作方法(例如erase)可以带const_iterator参数。

4

2 回答 2

8

不,它们之间没有太大的功能差异。当然,在 C++03 中曾经set<T>::iterator有过,当时没有返回const T&. 但是一旦他们改变了它,他们就被两种不同类型的迭代器困住了,它们都做同样的事情。

实际上,标准非常清楚它们具有相同的功能(以至于它们可以是相同的类型,但不是必须的)。从 23.2.4,p。6:

iterator关联容器属于双向迭代器类别。对于值类型与键类型相同的关联容器,两者iterator都是const_iterator常量迭代器。未指定iteratorconst_iterator是否为同一类型。[注: iterator andconst_iterator在这种情况下具有相同的语义,并且iterator可以转换为const_iterator. 用户可以通过始终const_iterator在其函数参数列表中使用来避免违反单一定义规则。——<em>尾注]

于 2012-09-05T14:10:27.507 回答
1

当我们(Err I)将我们的大型应用程序移植到 VC 10.0 时,这条规则生效了。它破坏了人们通过在迭代器上调用非 const 方法来操纵迭代器的各种旧代码。

这导致了我发现的最大区别:您只能在 const 迭代器上调用 const 方法。在旧标准中,您可以随意调用非常量方法并弄乱您的集合。在某些情况下,我最终用地图替换了一些集合,我发现代码绝对需要修改存储在容器中的项目。

希望有帮助。

于 2012-09-06T01:11:25.880 回答