У меня есть класс Foo
, который содержит карту
и предоставляет begin ()
и end ()
функции для итерации по нему:
class Foo {
typedef std::map<int, double> Container;
typedef Container::const_iterator const_iterator;
Container c_;
public:
const_iterator begin() const { return c_.begin(); }
const_iterator end() const { return c_.end(); }
void insert(int i, double d) { c_[i] = d; }
// ...
};
Теперь я хотел бы изменить его внутренне с std :: map
просто std :: set
, но я не хочу нарушать какой-либо клиентский код.
Итак, double d
в insert
функция теперь просто игнорируется. И следующий код должен оставаться действительным, где it-> second
теперь всегда будет просто 0,0
:
Foo foo;
for(Foo::const_iterator it = foo.begin(); it != foo.end(); ++it) {
std::cout << it->first << " " << it->second << std::endl;
}
Как я могу внести эти изменения в Foo
класс?
Другими словами, как я могу предоставить Foo :: const_iterator
, который адаптирует новый внутренний std :: set
, чтобы вести себя как старый ] std :: map
?
ОБНОВЛЕНИЕ: Причина, по которой я хочу избавиться от карты
, - это эффективность памяти. У меня миллионы экземпляров Foo
, и я не могу позволить себе хранить в них значения double
.