10

根据 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 对象的内容,并且类型签名中也没有任何内容表明这一点。有人可以帮我理解为什么这不起作用吗?

4

3 回答 3

16

对于std::set,它的关联类型iteratorconst_iterator类型都是常量双向迭代器。这样做的原因是因为std::set是有序的。如果您要通过迭代器修改集合中的元素,您将破坏该顺序。

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

由于您要插入5with insert(5),因此没有理由取消引用迭代器并分配5给它。

于 2013-04-30T11:51:28.043 回答
4

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

于 2013-04-30T11:51:11.707 回答
3

在 C++11 中,集合迭代器引用const类型(请参阅集合参考)。如果您考虑一下,这是有道理的,因为集合存储其元素是有序的,并且简单地更改某个元素很可能会违反排序约束。

于 2013-04-30T11:51:53.747 回答