【问题标题】:change element by iterator通过迭代器改变元素
【发布时间】:2011-12-25 01:09:51
【问题描述】:

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

  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() 返回。也许是从集合中挑选特定元素并改变他的更好方法。

【问题讨论】:

    标签: c++ std


    【解决方案1】:

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

    【讨论】:

    • +1:尽管这留下了一个问题:为什么begin 返回一个非const 迭代器?
    • 返回一个普通的迭代器是令人困惑的,但现在至少明白为什么我会得到这个错误。非常感谢。
    • @OliCharlesworth, Scypi:这有点棘手,迭代器不是const_iterator,而是一个可变迭代器。 Key 可以被索引为不可变。 §23.2.4p5 "[...] 关联容器中的键是不可变的。" 至于为什么它们提供非 const begin() 和 end(而不是 const_iterator 总是),我的猜测是这样做是为了保持容器接口尽可能统一。特别是 §23.2.4p6 指出,在这种情况下,iteratorconst_iterator 类型 可以相同,并建议始终使用 const_iterator 以避免违反 ODR。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 2021-02-15
    相关资源
    最近更新 更多