从std :: set :: insert()返回迭代器是const吗?

drw*_*owe 8 c++ stl

根据C++引用,set :: insert应该返回迭代器指向新插入元素的对,或者现有元素(如果存在).

但我有一个问题,分配给迭代器,因为这个简单的例子显示:

int main() {
  set<int> set;
  *set.insert(5).first = 5;
  return 0;
} 
Run Code Online (Sandbox Code Playgroud)

我尝试过G ++和Clang,但都不行.

set.cc:7:24: error: read-only variable is not assignable
  *set.insert(5).first = 5;
  ~~~~~~~~~~~~~~~~~~~~ ^
Run Code Online (Sandbox Code Playgroud)

我在文档中找不到任何指示迭代器应该遵循const对象的内容,类型签名中的任何内容都不会指示这一点.有人可以帮助我理解为什么这不起作用?

Jos*_*eld 14

因为std::set,它的关联iteratorconst_iterator类型都是常量双向迭代器.原因是因为std::set订购了.如果你通过迭代器修改集合的元素,那么你就会打破这种顺序.

考虑一个std::set有序元素{1, 4, 8}.如果你做了类似的事情*set.insert(5).first = 10;(如果它被允许),首先5插入get {1, 4, 5, 8},然后插入的元素将设置10为get {1, 4, 10, 8}.排序不变量现在已被打破.

既然你将5insert(5),没有理由取消引用迭代器,并分配5给它.


hus*_*had 5

您无法就地修改集合的成员。这是一个订购的容器。它的迭代器是不可分配的。