【问题标题】:std::set iterator const qualifier [duplicate]std::set 迭代器 const 限定符 [重复]
【发布时间】:2012-12-27 23:32:25
【问题描述】:

可能重复:
C++ STL set update is tedious: I can’t change an element in place

我被难住了:

struct File {
    struct Handle {
         size_t count;
    }; 
    std::set<Handle>::iterator handle_;
    ~File() {
        File::close(*this);
    }
    static void close(File &f) {
        (*f.handle_).count--;
    }
};

对于 ICC,错误是:

error #137: expression must be a modifiable lvalue
(*f.handle_).count++;
^

为什么 std::set::iterator 是常量?

【问题讨论】:

  • @jrok 哦……我现在明白了。无赖

标签: c++


【解决方案1】:

std::set::iterator 是一个常量迭代器,因为修改集合中元素的值可能会使元素的总排序和唯一性无效。要修改元素,您需要将其复制出来,擦除元素,修改副本,然后将其放回集合中。

Handle handle = *(f.handle_);
set.erase(f.handle_);
handle++;
set.insert(handle);

// or just set.insert(++handle) if you've overloaded prefix increment too

【讨论】:

  • 我认为这是标准委员会的错误。宁愿安全胜过灵活性和速度从来都不是 C++ 的方式。还有很多其他领域同样危险,您只需要了解它们即可。
  • 这不是一个错误。集合是“集合”,因为它是有序且唯一的。如果您可以进行这样的更新,那么它就不是一个集合,而是一个不同的数据结构。
  • std::not_a_set_for_long
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-11
  • 2012-10-03
  • 2020-11-22
  • 1970-01-01
相关资源
最近更新 更多