我认为我们可以通过 非const 迭代器为容器的elemnt分配一个新值。所以我试过了:
pcolor
并且失败了。为什么我失败了?
答案 0 :(得分:4)
根据标准N4431 §23.2.4/ 6关联容器[associative.reqmts] (强调我的):
关联容器的 iterator
属于双向迭代器类别。 对于值类型与键类型相同的关联容器,iterator和const_iterator都是常量迭代器。它是
未指定迭代器和const_iterator是否是同一类型。 [注意:iterator
和const_-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
的迭代器解除引用来更新元素。编译器不允许它,你会得到编译器错误。