Per qualche motivo sto iterando su elementi di una classe in un std::set
e vorrei modificare leggermente le chiavi, sapendo che l'ordine sarà invariato.Come posso migliorare questo design che mi obbliga a dichiarare una funzione membro const e dichiarare variabili mutabili?
Iteratori su std::set
sono const_iterators
perché se la chiave viene modificata, potrebbe causare un cattivo ordine e quindi nel danneggiamento dell'insieme. Tuttavia so per certo che le mie operazioni non cambieranno l'ordine dei miei elementi nel set.
Per il momento, ecco la mia soluzione:
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
}
Come ti modificarlo (So che potrei usare un std::map
ma io sono curioso di sapere se si può suggerire altre opzioni) per rimuovere mutevole e const?
Grazie
Qual è il motivo specifico per cui non si desidera utilizzare le mappe? È per motivi di layout di memoria (guarda gli allocatori?) O ragioni di stile del codice? – sehe
@sehe: Il motivo specifico è che voglio sapere se esistono altre opzioni prima di refactoring del codice. Non escludo completamente il passaggio alle mappe. – Benoit