Z jakiegoś powodu powtarzam iterację elementów klasy w std::set
i chcę nieco zmodyfikować klucze, wiedząc, że zamówienie pozostanie niezmienione.Jak mogę poprawić ten projekt, który zmusza mnie do deklarowania funkcji członkowskiej const i deklarowania zmiennych zmiennymi?
Iteratory na std::set
są const_iterators
, ponieważ jeśli klucz zostanie zmodyfikowany, może to doprowadzić do złej kolejności, a tym samym do uszkodzenia zestawu. Jednak wiem na pewno, że moje operacje nie zmienią kolejności moich elementów w zestawie.
Na razie tu jest moje rozwiązanie:
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
}
Jak można zmodyfikować go (wiem, mogłem użyć std::map
ale jestem ciekawy czy można zaproponować inne opcje), aby usunąć zmienne i const?
Dzięki
Jaki jest konkretny powód, dla którego nie chcesz używać map? Czy to ze względu na układ pamięci (spójrz na alokatory?) Czy powody stylu kodu? – sehe
@sehe: Szczególną przyczyną jest to, że chcę wiedzieć, czy istnieją inne opcje przed refaktoryzacją kodu. Nie wykluczam całkowicie przejścia na mapy. – Benoit