我收到以下错误消息:
"表达式必须是可修改的左值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
。
答案 0 :(得分:4)
是的,std::set
迭代器总是一个const迭代器,即使集合本身不是const
,即std::set::iterator
和std::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设置迭代器。