2013-04-30 102 views
7

根据C++引用,set :: insert应该返回pair,其中迭代器指向新插入的元素或现有元素(如果存在)。从std :: set :: insert()返回迭代器是否为const?

但我有分配给迭代器的一个问题,因为这个简单的例子说明:

int main() { 
    set<int> set; 
    *set.insert(5).first = 5; 
    return 0; 
} 

我试过G ++和锵既不作品。

set.cc:7:24: error: read-only variable is not assignable 
    *set.insert(5).first = 5; 
    ~~~~~~~~~~~~~~~~~~~~^

我找不到,指示迭代器应该尊重const对象的文档中任何事情,没有什么类型签名要么表明这一点。有人能帮我理解为什么这不起作用吗?

回答

13

对于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}。排序不变现在已经被打破。

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

+0

Duh。我应该想到这一点。谢谢。在我的真实例子中,它不是一个整数,是一个更复杂的对象,我想改变一些状态。 – drwowe 2013-04-30 11:54:47

4

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

3

在C++ 11中,设置迭代器是指const类型(请参阅set reference)。如果你仔细想想它是有道理的,因为一个集合存储了它的元素排序,而只是改变某个元素很可能会违反排序约束。

相关问题