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

12

据C++参考,set::insert应该返回一个pair,其中迭代器指向新插入的元素,或者是已存在的元素(如果存在)。

但是我遇到了一个问题,就像这个简单的例子所展示的:

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个回答

19

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

考虑一个有序元素为{1, 4, 8}std::set。如果你像这样执行*set.insert(5).first = 10;(如果允许的话),首先会插入5得到{1, 4, 5, 8},然后把插入的元素设置为10得到{1, 4, 10, 8}。现在排序不变性已经被破坏了。

既然你使用insert(5)插入了5,就没有必要解引用迭代器并将5赋给它。


1
我应该早就想到这个了。谢谢。在我的真实例子中,它不是一个int,而是一个更复杂的对象,我想改变一些状态。 - drwowe

5

你不能直接修改一个集合中的成员。它是一个有序容器,其迭代器不能被赋值。


3
在C++11中,set迭代器引用const类型(请参见set reference)。如果你仔细想想,这是有道理的,因为一个set存储其元素有序,简单地改变某个元素很可能会违反排序约束。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接