使用迭代器更改元素

13

我想通过使用迭代器来改变set中的元素,但遇到问题。以下简单代码可以解释我的意图。

  set<int> s;
  s.insert(12);

  set<int>::iterator it = s.begin();
  *it = 4; // error C3892: 'it' : you cannot assign to a variable that is const

为什么我不能修改正常迭代器所指向的值,而只能修改const_iterator所指向的值?

在我的代码中,迭代器是由set::find()返回的。也许有更好的方法从set中选择特定元素并进行更改。

1个回答

12

集合是一个有序容器(特别是它们被实现为平衡二叉搜索树)。如果通过迭代器更改元素的值,则顺序不变量将被破坏。根据你想要实现的内容,你可能最好选择不同的容器或获得该值,删除元素并将新元素插入集合中。


3
尽管如此,这仍然引出了一个问题:为什么begin返回一个非const迭代器? - Oliver Charlesworth
返回一个普通的迭代器很令人困惑,但现在我至少明白为什么会出现这个错误了。非常感谢。 - Scypi
@OliCharlesworth,Scypi:这有点棘手,迭代器不是const_iterator,而是可变迭代器。可以索引的是Key,它是不可变的。§23.2.4p5 *"[...]关联容器中的键是不可变的。"*至于为什么提供非const begin()和end(而不是始终使用const_iterator),我猜测这是为了尽可能保持容器接口的统一性。特别是§23.2.4p6指出,在这种情况下,类型iteratorconst_iterator可以相同,并建议始终使用const_iterator以避免ODR违规。 - David Rodríguez - dribeas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接