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