У меня есть класс Foo
, который содержит map
и предоставляет функции 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<int, double>
на std::set<int>
, но я не хочу нарушать какой-либо клиентский код.
Так что 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<int>::const_iterator
к поведению, аналогичному старому std::map<int,double>::const_iterator
?
ОБНОВЛЕНИЕ: Причина, по которой я хочу избавиться от map
, заключается в эффективности памяти. У меня есть миллионы Foo
экземпляров, и я не могу позволить себе хранить значения double
в них.