根据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对象的内容,类型签名中的任何内容都不会指示这一点。有人可以帮助我理解为什么这不起作用吗?
答案 0 :(得分:14)
对于std::set
,其关联的iterator
和const_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)。如果你考虑它就有意义,因为一个集合存储了它的元素,只是改变某个元素很可能违反了排序约束。