This question already has answers here:
How can I improve this design that forces me to declare a member function const and declare variables mutable?

(3个答案)


已关闭8年。




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

最佳答案

对于 std::set ,其关联的iteratorconst_iterator类型都是恒定的双向迭代器。这样做的原因是因为std::set是有序的。如果要通过迭代器修改集合的元素,则会破坏该顺序。

考虑一个带有有序元素std::set{1, 4, 8}。如果您随后进行了类似*set.insert(5).first = 10;的操作(如果允许的话),则将首先插入5以获得{1, 4, 5, 8},然后将插入的元素设置为10以获得{1, 4, 10, 8}。现在,排序不变式已被破坏。

由于您要使用5插入insert(5),因此没有理由取消对迭代器的引用并为其分配5

关于c++ - 从std::set::insert()返回迭代器是const吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16299125/

10-16 04:33