由於某種原因,我在std::set
中迭代了一個類的元素,並且想要稍微修改這些鍵,並知道該順序將保持不變。我該如何改進這種強迫我聲明一個成員函數const並聲明變量可變的設計?
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
,但我很好奇,你是否可以建議其他選項),以去除可變和const?
感謝
你不想使用地圖的具體原因是什麼?是因爲內存佈局的原因(看分配器?)還是代碼風格的原因? – sehe
@sehe:具體原因是我想知道在重構代碼之前是否存在其他選項。我並不完全排除切換到地圖。 – Benoit