std::设置迭代器常量限定符

std::set iterator const qualifier

本文关键字:迭代器 设置 std 常量      更新时间:2023-10-16

可能重复:
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::迭代器是const?

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