Как настроить итератор набора, чтобы он работал как итератор карты?

У меня есть класс 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 :: const_iterator , чтобы вести себя как старый ] std :: map :: const_iterator ?

ОБНОВЛЕНИЕ: Причина, по которой я хочу избавиться от карты , - это эффективность памяти. У меня миллионы экземпляров Foo , и я не могу позволить себе хранить в них значения double .

5
задан Frank 12 November 2010 в 14:25
поделиться