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.

Author: Yatin, 2013-01-28

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.
 40
Author: Karthik T,
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';
} 
 18
Author: BoshWash,
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;
}
 15
Author: mcsilvio,
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.
 4
Author: Alok Save,
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
 2
Author: billz,
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