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应该返回对,其中迭代器指向新插入的元素或现有的元素(如果存在)。
但是我在分配给迭代器时遇到问题,如以下简单示例所示:
我已经尝试过G++和Clang,但都没有用。
我在文档中找不到任何指示迭代器应遵从const对象的内容,并且类型签名中的任何内容都不能表明这一点。有人可以帮我了解为什么这行不通吗?
(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
,其关联的iterator
和const_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