通过迭代器分配给一个元素

时间:2015-06-14 16:29:08

标签: c++ stl

我认为我们可以通过 非const 迭代器为容器的elemnt分配一个新值。所以我试过了:

pcolor

并且失败了。为什么我失败了?

3 个答案:

答案 0 :(得分:4)

根据标准N4431 §23.2.4/ 6关联容器[associative.reqmts] 强调我的):

关联容器的

iterator属于双向迭代器类别。 对于值类型与键类型相同的关联容器,iterator和const_iterator都是常量迭代器。它是 未指定迭代器和const_iterator是否是同一类型。 [注意:iteratorconst_-iterator在这种情况下具有相同的语义,iterator可转换为const_iterator。用户可以通过在函数参数列表中始终使用const_iterator来避免违反单一定义规则.-尾注]。

std::set是一个关联容器,其值类型与键类型相同,因此std::set<T>::iterator是一个常量迭代器。因此,你得到的失败是合理的。

答案 1 :(得分:3)

set实际上没有非const迭代器,因为它的元素是不可变的。如果你考虑一下,假设你通过迭代器更改密钥。为什么穷人会移动节点以保持树不变量等等?

更详细的&amp;细致入微的讨论,见Angelika Langer的this piece

答案 2 :(得分:3)

std::set在内部保留元素的顺序。它基本上是一个红黑树二进制实现并使用std :: less&lt;&gt;作为其默认比较器。所以如果我稍微修改你的例子如下:

    typedef std::set<int>::iterator it;
    std::set<int> set_int;
    set_int.insert(1);
    set_int.insert(6); //I added 
    it i = set_int.begin(); //error: assignment of read-only location
    *i = 11;

11无法放入std :: set容器的第一个迭代器位置,因为它违反了它的顺序。

因此很明显,我们无法使用std::set的迭代器解除引用来更新元素。编译器不允许它,你会得到编译器错误。