这里使用迭代器有什么问题

时间:2019-10-13 11:08:36

标签: c++ stl iterator

我刚开始使用c ++ stl,却无法找出错误...非常感谢您的帮助...

int count = 0 ;
while (!s.empty()) 
{
    s.erase(--s.end());
    set<int >::iterator it;
    for (it = s.begin(); it != s.end(); it++) 
    {

        if (*it > 0)
            * it -= r; //*error : expression must be modifiable lvalue
             //r is a constant
        else 
            s.erase(it);
    }
    count++;
}

cout << count;

3 个答案:

答案 0 :(得分:1)

set的迭代器是常量,无法对其进行修改。

  

成员类型iterator和const_iterator可能是   相同的类型。这意味着使用定义一对函数重载   两种类型的参数类型可能违反“一个定义规则”。   由于迭代器可转换为const_iterator,因此一个函数   改为使用const_iterator作为参数类型。

这些元素是恒定的,您也无法对其进行修改。

解决此问题的方法是删除要修改的元素,然后插入要拥有的新元素。

答案 1 :(得分:1)

如果已将迭代器制成常量,则无法修改其值。最好将变量类型更改为简单变量或创建任何您希望拥有的新变量。 这可能对您有帮助 https://www.geeksforgeeks.org/how-to-modify-a-const-variable-in-c/

答案 2 :(得分:0)

@Oblivion有答案,但我会说略有不同。

set是元素的有序集合。该顺序由set维护。如果可以(通过迭代器)更改set的元素,则将破坏集合中元素的顺序,因此集合提供的迭代器仅使您可以读取集合中的元素

如果您要“更改”集合中某个条目的值,则可以删除旧的条目,然后插入一个新的(可能是不同的)条目。