std :: set iterator const限定符

时间:2012-12-27 23:32:26

标签: c++

  

可能重复:
  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 const?

1 个答案:

答案 0 :(得分:3)

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