在这里使用迭代器有啥问题

Posted

技术标签:

【中文标题】在这里使用迭代器有啥问题【英文标题】:What's the issue using iterator here在这里使用迭代器有什么问题 【发布时间】:2019-10-13 11:08:36 【问题描述】:

我刚开始使用 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;

【问题讨论】:

如果sset 你不能用*it -= r; 修改value_typeset 中的所有项目都是只读的。通过修改此元素,您将重新排列集合中的所有项目。 Modifying elements in std::set的可能重复 【参考方案1】:

set 的迭代器是常量,不能修改。

成员类型 iterator 和 const_iterator 可以是 同类型。这意味着使用 两种类型作为参数类型可能违反单一定义规则。 由于迭代器可转换为 const_iterator,因此单个函数 使用 const_iterator 作为参数类型将起作用。

元素是不变的,你也无法修改它们。

解决您的问题的方法是删除您希望修改的元素并插入您希望拥有的新元素。

【讨论】:

为什么不提取+修改+合并?分配更少。【参考方案2】:

如果你做了一个迭代器常量你不能修改它的值。最好将变量类型更改为简单变量或创建您希望拥有的任何新变量。 这可能会帮助你 https://www.geeksforgeeks.org/how-to-modify-a-const-variable-in-c/

【讨论】:

【参考方案3】:

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

set 是元素的有序集合。订单由set 维护。如果您可以更改 set 的元素(通过迭代器),那么您将破坏集合中元素的顺序,因此集合提供的迭代器只允许您对集合中的元素进行读取访问。

如果你想“改变”集合中一个条目的值,你可以删除旧的并插入一个新的(可能是不同的)。

【讨论】:

以上是关于在这里使用迭代器有啥问题的主要内容,如果未能解决你的问题,请参考以下文章

通过引用传递 C++ 迭代器有啥问题?

python中的迭代器有啥用

python 生成器和迭代器有这篇就够了

迭代器的解释

c++中迭代器的问题为啥这样会报错?

我应该使用迭代器还是 for 循环来迭代?