Часто у вас есть карта типа map<string,X>
, где ключом является имя сопоставленного значения, и вам нужен API, который позволяет потребителям видеть все имена ... для заполнения списка GUI, например.Вы можете построить вектор и вернуть его как вызов API, но это довольно неэффективно.Вы можете просто вернуть ссылку на карту, но тогда значения также будут доступны, и вы, возможно, этого не захотите.
Итак, как вы могли бы написать совместимый класс KeyIterator, который переносит карту и предоставляет стандартный доступ итератора кключи на этой карте.
например:
map<string,X> m= ...
KeyIterator<string> ki(m);
for(KeyIterator<string>::iterator it=ki.begin();it!=ki.end();++it)
cout << *it;
KeyIterator должен быть легковесным, чтобы вы могли вернуть его из метода практически без затрат.
edit: Я не уверен, что объяснил отлично, позвольте мне привести лучший вариант использования (полупсевдо):
class PersonManager
{
private:
map<string,Person> people;
public:
//this version has to iterate the map, build a new structure and return a copy
vector<string> getNamesStandard();
//this version returns a lightweight container which can be iterated
//and directly wraps the map, allowing access to the keys
KeyIterator<string> getNames();
};
void PrintNames(PersonManager &pm)
{
KeyIterator<string> names = pm.getNames();
for(KeyIterator<string>::iterator it=names.begin();it!=names.end();++it)
cout << *it << endl;
}