【问题标题】: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 中的所有项目都是只读的。通过修改此元素,您将重新排列集合中的所有项目。

标签: c++ stl iterator


【解决方案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 的元素(通过迭代器),那么您将破坏集合中元素的顺序,因此集合提供的迭代器只允许您对集合中的元素进行读取访问。

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

    【讨论】:

      猜你喜欢
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      • 2021-10-03
      • 1970-01-01
      • 2011-01-22
      相关资源
      最近更新 更多