17 września 2012

Kopiowanie kluczy mapy

Szukałem ładnego sposobu na wydobycie kluczy z mapy, tak by nie tworzyć pętli for iterującej po mapie i przepisującej wartość it->first do jakiegoś kontenera. Na szczęście okazało się, że biblioteka boost oferuje gotowy przykład:
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