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 deconst_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;
}
}