Допустим, у меня есть класс:
class NumberCollection
{
public:
typedef std::set<int> SetType;
typedef SetType::iterator iterator;
void insert(int n);
iterator begin();
iterator end();
size_t size() const;
iterator difficultBegin();
iterator difficultEnd();
size_t difficultSize() const;
private:
SetType easySet_, difficultSet_;
}
Где insert()
добавляет элемент к easySet_
. Члены difficultSet_
меняются в зависимости от членов easySet_
.
Проблема, с которой я столкнулся, заключается в том, что множественные вставки означают, что difficultSet_
постоянно пересчитывается. Поэтому я хочу, чтобы difficultSet_
вычислялся лениво (т. Е. Только при вызове difficultBegin()
, difficultEnd()
или difficultSize()
). Проблема в том, что тогда мне действительно нужно превратить difficultSet_
в mutable
, потому что иначе difficultSize()
не может работать с ним.
Так что теперь мое объявление класса выглядит как
class NumberCollection
{
public:
typedef std::set<int> SetType;
typedef SetType::iterator iterator;
void insert(int n);
iterator begin();
iterator end();
size_t size() const;
iterator difficultBegin();
iterator difficultEnd();
size_t difficultSize() const;
private:
SetType easySet_;
mutable SetType difficultSet_;
mutable bool upToDate_;
}
Хотя я чувствую, что это плохой дизайн. Есть ли лучший способ?