C++ 通过迭代器更改元素

C++ 通过迭代器更改元素,c++,std,C++,Std,当我想用迭代器改变集合的元素时,我遇到了问题。 这个简单的代码可以解释我想做什么 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 set; s、 插入(12); set::iterator it=s.begin(); *it=

当我想用迭代器改变集合的元素时,我遇到了问题。 这个简单的代码可以解释我想做什么

  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
set;
s、 插入(12);
set::iterator it=s.begin();
*it=4;//错误C3892:“它”:不能分配给常量变量
为什么我不能更改普通迭代器而不是常量迭代器指向的值


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

集合是一个有序的容器(特别是它们被实现为平衡的二进制搜索树)。如果您能够通过迭代器更改元素的值,则顺序不变量将被破坏。根据您试图实现的目标,您最好使用不同的容器或获取值,删除元素并在集合中插入新元素。

+1:尽管这留下了一个问题:
begin
为什么返回非
常量
迭代器?返回普通迭代器令人困惑,但现在至少明白我为什么会犯这个错误了。非常感谢。@OliCharlesworth,Scypi:这有点棘手,迭代器不是
常量迭代器,而是可变迭代器。可以索引的是
,而不是不可变的键。§23.2.4p5“[…]关联容器中的键是不可变的。”至于为什么它们提供非常量
begin()
和end(而不是
const_iterator
始终),我猜想这是为了尽可能保持容器接口的一致性。特别是§23.2.4p6规定,在这种情况下,
迭代器
常量迭代器
的类型可以相同,并建议始终使用
常量迭代器
,以避免ODR违规。