http://www.boost.org/doc/libs/1_43_0/libs/range/doc/html/range/reference/adaptors/reference/map_keys.html
Jest to zastosowanie wzorca projektowego "adapter". Wykorzystuje on i przekształca istniejący interfejs w taki jakiego oczekuje klient. Tutaj Range iterator zostaje owrapowany w ten sposób, że nowy iterator, zwraca to czego oczekujemy.
#include <boost/range/adaptor/map.hpp> #include <boost/range/adaptor/reversed.hpp> #include <boost/range/algorithm_ext/push_back.hpp> #include <boost/foreach.hpp> #include <iostream> #include <map> #include <vector> int main() { std::map<std::string, int> m; m["first"] = 301; m["second"] = 302; m["third"] = 54; std::vector<std::string> v; boost::push_back(v, m | boost::adaptors::reversed | boost::adaptors::map_keys); boost::push_back(v, boost::adaptors::keys( boost::adaptors::reverse(m))); BOOST_FOREACH(std::string& s, v) { std::cout << s << std::endl; } return 0; }Istnieją dwa sposoby na stworzenia adaptera, pierwsza z wykorzystaniem operator|(), druga to skorzystanie z metod. Wygląda na to, że kolejność nakładanie adapterów nie ma znaczenia. Ale to trzeba doczytać, albo przetestować jeszcze.
Dodatkowo wszystkie klucze wpisuje w odwrotnej kolejności. A oto wynik
third second first third second first
Brak komentarzy:
Prześlij komentarz