1

可能重复:
C++ STL 集更新很乏味:我无法就地更改元素

我很难过:

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 是常量?

4

1 回答 1

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
于 2012-12-27T23:35:00.450 回答