Typowym przykładem pętli opartych na zakresie C ++ 11 dla () jest zawsze coś takiego:
std::vector<int> numbers = { 1, 2, 3, 4, 5, 6, 7 };
for ( auto xyz : numbers )
{
std::cout << xyz << std::endl;
}
W którym xyz
to przypadku jest int
. Ale co się dzieje, gdy mamy coś w rodzaju mapy? Jaki jest typ zmiennej w tym przykładzie:
std::map< foo, bar > testing = { /*...blah...*/ };
for ( auto abc : testing )
{
std::cout << abc << std::endl; // ? should this give a foo? a bar?
std::cout << abc->first << std::endl; // ? or is abc an iterator?
}
Gdy kontener, przez który przechodzi się, jest czymś prostym, wygląda na to, że pętle oparte na zakresie dla () dadzą nam każdy element, a nie iterator. Co jest miłe ... gdyby to był iterator, pierwszą rzeczą, którą zawsze musielibyśmy zrobić, to zrezygnować z niego.
Ale jestem zdezorientowany, czego się spodziewać, jeśli chodzi o takie rzeczy jak mapy i multimapy.
(Nadal używam g ++ 4.4, podczas gdy pętle oparte na zakresie są w g ++ 4.6+, więc nie miałem jeszcze okazji tego wypróbować.)
c++
c++11
for-loop
dictionary
Stéphane
źródło
źródło
std::begin
istd::end
funkcjami lub funkcjami składowymi o tej samej nazwie.Odpowiedzi:
Każdy element zbiornika jest
map<K, V>::value_type
, co jesttypedef
nastd::pair<const K, V>
. W związku z tym w C ++ 17 lub nowszym możesz pisaćlub jako
jeśli nie planujesz modyfikować wartości.
W C ++ 11 i C ++ 14 można użyć rozszerzonych
for
pętli do samodzielnego wyodrębnienia każdej pary, a następnie ręcznie wyodrębnić klucze i wartości:Możesz również rozważyć oznaczenie
kv
zmiennej,const
jeśli chcesz zobaczyć wartości tylko do odczytu.źródło
W C ++ 17 nazywa się to powiązaniami strukturalnymi , co pozwala na:
źródło
const &
klucz, ale nie stałe odniesienie do wartości? (ponieważ to właśnie robi mapa :: typ_wartości ...)k
isconst
if you usefor(auto&[k,v]:testing)
Z tego artykułu: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2049.pdf
for( type-specifier-seq simple-declarator : expression ) statement
jest składniowo równoważny z
Możesz więc wyraźnie zobaczyć, że tak będzie
abc
w twoim przypadkustd::pair<key_type, value_type >
. Aby wydrukować, możesz uzyskać dostęp do każdego elementu za pomocąabc.first
iabc.second
źródło
Jeśli chcesz zobaczyć tylko klucze / wartości z mapy i lubisz używać boosta, możesz użyć adapterów boost z pętlami opartymi na zakresie:
istnieje odpowiednik boost :: adapters :: key_values
http://www.boost.org/doc/libs/1_51_0/libs/range/doc/html/range/reference/adaptors/reference/map_values.html
źródło
Jeśli operator przypisywania kopii foo i paska jest tani (np. Int, char, wskaźnik itp.), Możesz wykonać następujące czynności:
źródło