По какой-то причине я перебираю элементы класса в 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
, но мне интересно, можете ли вы предложить другие варианты), чтобы удалить mutable и const?
Спасибо