Как я могу улучшить этот дизайн, который заставляет меня объявить функцию-член const и объявить переменные изменяемыми?

По какой-то причине я перебираю элементы класса в std :: set и хотел бы немного изменить ключи, зная, что порядок будет без изменений.

Итераторами в std :: set являются const_iterators , потому что изменение ключа может привести к неправильному порядку и, следовательно, к повреждению набора. Однако я точно знаю, что мои операции не изменят порядок моих элементов в наборе.

На данный момент вот мое решение:

class Foo
{
public:
    Foo(int a, int b): a_(a),b_(b) {}
   ~Foo(){}
    bool operator < (const Foo& o) const { return this.a_ < o.a_ ; }
    void incrementB() const { ++b_; } // <-- the problem: it is not const!
private:
    const int a_;
    mutable int b_;                   // <-- I would like to avoid this
}

void f()
{
    std::set<Foo> s;
    // loop and insert many (distinct on a_) Foo elements;
    std::for_each(s.begin(), c.end(), [](const Foo& s) { s.incrementB(); }); // Foo must be const. iterators are const_iterators
}

Как бы вы его изменили (я знаю, что могу использовать std :: map , но мне любопытно, можете ли вы предложить другие варианты), чтобы удалить изменяемый и константный?

Спасибо

6
задан Benoit 28 November 2011 в 09:48
поделиться