Mam klasy Foo
że zawiera map
i zapewnia begin()
i end()
funkcje iteracyjne nad nim:Jak dostosować iterator zestawu, aby zachowywał się jak iterator mapy?
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; }
// ...
};
Teraz chciałbym zmienić go wewnętrznie od std::map<int, double>
do zaledwie std::set<int>
, ale nie chcę złamać dowolny kod klienta.
Teraz funkcja double d
w funkcji insert
zostanie po prostu zignorowana. I następujący kod powinien nadal być ważne, gdzie it->second
będzie teraz po prostu zawsze być 0.0
:
Foo foo;
for(Foo::const_iterator it = foo.begin(); it != foo.end(); ++it) {
std::cout << it->first << " " << it->second << std::endl;
}
Jak mogę dokonać tych zmian w klasie Foo
?
Innymi słowy, w jaki sposób mogę zapewnić Foo::const_iterator
, który dostosowuje nowy wewnętrzny std::set<int>::const_iterator
, aby zachowywał się jak stary std::map<int,double>::const_iterator
?
AKTUALIZACJA: Powodem, dla którego chcę pozbyć się map
jest wydajność pamięci. Mam miliony instancji Foo
i nie mogę pozwolić sobie na zapisanie w nich wartości double
.
Szczerze mówiąc, to brzmi jak naprawdę zły pomysł. Utrzymywanie zgodności umowy, gdy semantyka całkowicie się zmieniła, nie ma znaczenia. –
@KonradRudolph C++ robi to od pierwszego dnia. – wilhelmtell
@wilhelm: To prawda. Ale nie ma powodu, by robić to samo. –