Jak iterować strukturę danych map C++ STL używając słowa kluczowego 'auto'?
Do tej pory zawsze używałem iteratora do przechodzenia przez wszystkie klucze na mapie STL w następujący sposób:
for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.end(); ++it){
std::cout << it->first << " => " << it->second << '\n';
}
Bardzo niedawno natknąłem się na kod, który używał innego stylu do iteracji przez klucze, jak pokazano poniżej. Czy ta funkcja została dodana dopiero niedawno w revised standard? Wydaje się, że jest to dość interesujący sposób na lepsze wykorzystanie mniejszego kodu, jak zapewnia już wiele innych języków.
for (auto& x: mymap) {
std::cout << x.first << " => " << x.second << '\n';
}
Również jestem ciekaw, czy dokładnie implikacje użycia słowa kluczowego "auto" tutaj.
5 answers
Ten kod używa 2 nowych funkcji z najnowszego standardu C++ (C++11), auto keyword, for type inference , oraz range based for loop .
Używając tylko auto
można to zapisać jako (thanks Ben)
for (auto it=mymap.begin(); it!=mymap.end(); ++it)
Użycie tylko zakresu do tego można zapisać jako
for (std::pair<const char,int>& x: mymap) {
std::cout << x.first << " => " << x.second << '\n';
}
Obie wykonują dokładnie to samo zadanie, co dwie wersje.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-02 07:50:48
W uzupełnieniu do poprzednich odpowiedzi, C++17 dodał inne podejście z wykorzystaniem wiązań strukturalnych:
for (auto& [key, value]: mymap) {
std::cout << key << " => " << value << '\n';
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-23 18:34:35
Zadziałało dla mnie:
for (auto x: mymap) {
cout << x.first << endl;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-31 16:28:27
Jestem ciekaw dokładnych konsekwencji użycia słowa kluczowego "auto" tutaj.
Umożliwia:
- mniej pisania dla typowego kodu iteracyjnego
- mniejsze szanse na błędy manualne, ponieważ kompilator wydedukuje dokładny typ iteratora.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-28 05:10:23
Jest to nowa funkcja w C++11, nazywa się Range-Based for Loops
, która iteruje na wszystkich elementach danego zakresu, tablicy lub kolekcji. To, co w innych językach programowania byłoby nazywane pętlą foreach, ogólna składnia jest następująca:
for ( decl : coll ) {
statement
}
Auto : automatyczne odliczanie Typu za pomocą auto
W C++11 Można zadeklarować zmienną lub obiekt bez określania jej konkretnego typu, na przykład za pomocą:
auto i = 42; // i has type int
double f();
auto d = f(); // d has type double
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-28 05:15:30