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

时间:2013-04-30 11:46:35

标签: c++ stl

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

但是我在分配给迭代器时遇到了问题,正如这个简单的例子所示:

int main() {
  set<int> set;
  *set.insert(5).first = 5;
  return 0;
} 

我尝试过G ++和Clang,但都没有。

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

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

3 个答案:

答案 0 :(得分:14)

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

考虑使用有序元素std::set的{​​{1}}。如果您之后执行{1, 4, 8}之类的操作(如果允许的话),则会插入第一个*set.insert(5).first = 10;以获取5,然后将插入的元素设置为{1, 4, 5, 8}以获取10。排序不变量现已被打破。

由于您使用{1, 4, 10, 8}插入5,因此没有理由取消引用迭代器并为其分配insert(5)

答案 1 :(得分:4)

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

答案 2 :(得分:3)

在C ++ 11中,设置迭代器引用const类型(参见set reference)。如果你考虑它就有意义,因为一个集合存储了它的元素,只是改变某个元素很可能违反了排序约束。