【问题标题】:Is there an operational difference between std::set::iterator and std::set::const_iterator?std::set::iterator 和 std::set::const_iterator 之间是否存在操作差异?
【发布时间】:2012-09-05 14:05:37
【问题描述】:
对于大多数容器,iterator 类型提供对容器中值的读写访问,const_iterator 类型提供只读访问。但是,对于std::set<T>,迭代器类型不能提供读写访问,因为修改集合中的值(可能)会破坏容器不变量。因此,在std::set<T> 中,iterator 和const_iterator 都提供只读访问权限。
这引出了我的问题:std::set<T>::iterator 可以做的事情和std::set<T>::const_iterator 可以做的事情之间有什么区别吗?
请注意,在 C++11 中,容器的操作方法(例如,erase)可以采用 const_iterator 参数。
【问题讨论】:
标签:
c++
c++11
iterator
set
containers
【解决方案1】:
不,它们之间没有太大的功能差异。当然,当set<T>::iterator 没有返回const T& 时,曾经回到了 C++03。但是一旦他们改变了它,他们就被两种不同类型的迭代器困住了,它们都做同样的事情。
确实,标准非常清楚它们具有相同的功能(以至于它们可以是相同的类型,但不是必须的)。从 23.2.4,p。 6:
iterator 的关联容器属于双向迭代器类别。对于值类型与键类型相同的关联容器,iterator 和const_iterator 都是常量迭代器。未指定 iterator 和 const_iterator 是否为同一类型。 [ 注意: iterator 和 const_iterator 在这种情况下具有相同的语义,iterator 可以转换为 const_iterator。用户可以通过在其函数参数列表中始终使用const_iterator 来避免违反单一定义规则。 —尾注 ]
【解决方案2】:
当我们 (Err I) 将我们的大型应用程序移植到 VC 10.0 时,此规则生效。它破坏了人们通过在迭代器上调用非 const 方法来操纵迭代器的各种旧代码。
这导致了我发现的最大区别:您只能在 const 迭代器上调用 const 方法。在旧标准中,您可以随意调用非常量方法并弄乱您的集合。在某些情况下,我最终用地图替换了一些集合,我发现代码绝对需要修改存储在容器中的项目。
希望对您有所帮助。