values loop functions c++ stl map c++-faq traversal

c++ - loop - stl map find



¿Cómo recorrer/iterar el mapa STL? (4)

Al igual que con cualquier contenedor STL, los métodos begin() y end() devuelven iteradores que puede usar para iterar sobre el mapa. La desreferenciación de un iterador de mapa produce un std::pair<const Key, Value> .

Necesito saber cómo atravesar un mapa stl. No quiero usar su llave. No me importa el orden, solo una forma de acceder a todos los elementos que contiene. ¿Hay alguna forma de hacer esto?


Puede iterar el mapa usando iterador automático.

Fragmento de código:

#include<bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); map<string, int> mp; mp["a"]=500; mp["b"]=200; mp["d"]=300; mp["c"]=400; for(auto it=mp.begin(); it != mp.end(); it++) { cout<<it->first <<" : "<<it->second<<endl; } return 0; }


Puede recorrer el mapa STL de la misma manera que cualquier otro contenedor STL: utilizando iteradores, por ejemplo,

for (std::map<key, value>::const_iterator i = myMap.begin(), end = myMap.end(); i != end; ++i) { // *i is a key-value pair }


Sí, puedes atravesar un map biblioteca estándar. Este es el método básico utilizado para recorrer un map y sirve como guía para recorrer cualquier colección de la Biblioteca estándar:

C ++ 03 / C ++ 11:

#include <cstdlib> #include <map> #include <string> using namespace std; int main() { typedef map<int,string> MyMap; MyMap my_map; // ... magic for( MyMap::const_iterator it = my_map.begin(); it != my_map.end(); ++it ) { int key = it->first; string value = it->second; } }

Si necesitas modificar los elementos:

  • Usa iterator lugar de const_iterator .
  • En lugar de copiar los valores fuera del iterador, obtenga una referencia y modifique los valores a través de eso.

    para (MyMap :: iterator it = my_map.begin (); it! = my_map.end (); ++ it) {int key = it-> first; string & value = it-> second; if (value == "foo") value = "bar"; }

Así es como usted atraviesa normalmente los contenedores de la biblioteca estándar a mano. La gran diferencia es que para un map el tipo de *it es un pair lugar del elemento en sí.

C ++ 11

Si tiene el beneficio de un compilador de C ++ 11 (por ejemplo, el último GCC con --std=c++11 o MSVC), entonces también tiene otras opciones.

Primero, puede utilizar la palabra clave auto para deshacerse de toda esa desagradable verbosidad:

#include <cstdlib> #include <map> #include <string> using namespace std; int main() { map<int,string> my_map; // ... magic for( auto it = my_map.begin(); it != my_map.end(); ++it ) { int key = it->first; string& value = it->second; } }

En segundo lugar, también puede emplear lambdas. Junto con decltype , esto podría resultar en un código más limpio (aunque con compensaciones):

#include <cstdlib> #include <map> #include <string> #include <algorithm> using namespace std; int main() { map<int,string> my_map; // ... magic for_each(my_map.begin(), my_map.end(), [](decltype(*my_map.begin()) val) { string& value = val.second; int key = val.first; }); }

C ++ 11 también presenta el concepto de un rango de bases for bucle, que puede reconocer como similar a otros idiomas. Sin embargo, algunos compiladores no son totalmente compatibles con esto todavía, en particular, MSVC.

#include <cstdlib> #include <map> #include <string> #include <algorithm> using namespace std; int main() { map<int,string> my_map; // ... magic for(auto val : my_map ) { string& value = val.second; int key = val.first; } }