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 は const なのですか?

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 に答える