成对的迭代器是const吗? [重复]

问题描述 投票:0回答:2

这个问题在这里已有答案:

我收到以下错误消息:

“表达式必须是可修改的左值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

c++ iterator const
2个回答
4
投票

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

正如它在23.2.4中所说的那样

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


4
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.