成对的迭代器是const吗?

时间:2014-08-28 20:52:26

标签: c++ iterator const

我收到以下错误消息:

  

"表达式必须是可修改的左值iter-> first = iter-> second;"

代码:

func( const std::set<Edge> &obstructEdges1,
      const std::set<Edge> &obstructEdges2 )
{
std::set<Edge> obstructEdges = obstructEdges1;
obstructEdges.insert( obstructEdges2.begin(), obstructEdges2.end() );

for ( std::set<Edge>::iterator iter = obstructEdges.begin();
    iter != obstructEdges.end(); iter++ )
{
  if ( iter->first > iter->second )
  {
    int t = iter->first;
    iter->first = iter->second;
    iter->second = t;
  }
...

Edge是一对整数。怎么了?由于某种原因,iter->first被视为const

2 个答案:

答案 0 :(得分:4)

是的,std::set迭代器总是一个const迭代器,即使集合本身不是const,即std::set::iteratorstd::set::const_iterator都是常量迭代器(并且可以引用相同的类型)。请注意,std::set是一个关联容器。在标准关联容器中,您不能修改存储的密钥,这意味着在std::set中您根本不允许修改任何内容。当然,您的比较器不必将整个set元素视为键,但从std::set的角度来看,整个事物是关键,因此是不可变的。

如23.2.4所述

  

6 关联容器的迭代器属于双向迭代器类别。对于值类型为的关联容器   与键类型相同,迭代器和const_iterator都是   常数迭代器。它是否未指定迭代器和   const_iterator是相同的类型。

答案 1 :(得分:4)

set<T>::iterator始终是一个常量迭代器,就像set<T>::const_iterator一样,所以你不能用它来修改集合的任何元素。如果您可以直接修改集合的元素,那么集合很可能会变得无序,这只会导致Bad Things™。

*好吧,至少从C ++ 11开始,尽管任何主要的实现都不可能在此之前持有非const设置迭代器。