这个问题在这里已有答案:
我收到以下错误消息:
“表达式必须是可修改的左值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
。
是的,std::set
迭代器总是一个const迭代器,即使集合本身不是const
,即std::set::iterator
和std::set::const_iterator
都是常量迭代器(并且可以引用相同的类型)。请注意,std::set
是一个关联容器。在标准关联容器中,您不能修改存储的密钥,这意味着在std::set
中您根本不允许修改任何内容。当然,你的比较器不必将整个set元素视为关键,但从std::set
的角度来看,整个事物是关键,因此是不可变的。
正如它在23.2.4中所说的那样
6关联容器的迭代器是双向迭代器类别。对于值类型与键类型相同的关联容器,iterator和const_iterator都是常量迭代器。未指定迭代器和const_iterator是否是同一类型。
set<T>::iterator
总是*一个常量迭代器,就像set<T>::const_iterator
一样,所以你不能用它来修改集合的任何元素。如果你可以直接修改集合的元素,那么集合很可能会变得无序,这只会导致Bad Things™。
*好吧,至少从C ++ 11开始,尽管任何主要实现都不可能在此之前持有非const设置迭代器。