std :: set :: iterator和std :: set :: const_iterator之间是否存在操作差异?

时间:2012-09-05 14:05:38

标签: c++ c++11 iterator set containers

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

这引出了我的问题:您可以使用std::set<T>::iterator执行的操作与使用std::set<T>::const_iterator执行的操作之间有什么区别吗?

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

2 个答案:

答案 0 :(得分:7)

不,它们之间没有太大的功能差异。当然,当set<T>::iterator没有返回const T&时,使用回到C ++ 03中。但是一旦他们改变它,他们就会遇到两种不同的迭代器,它们都做同样的事情。

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

  关联容器的

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

答案 1 :(得分:1)

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

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

希望有所帮助。