sirve para mapa libreria funciona funcion ejemplo diccionarios como c++ collections vector map

para - C++ cómo copiar un mapa a un vector



mapa en c++ (7)

Esta pregunta ya tiene una respuesta aquí:

¿Cuál es la mejor manera en C ++ de copiar un par de un mapa a un vector? Estoy haciendo esto para poder ordenar el vector.


Esto debería hacer lo que quieras:

#include <iostream> #include <vector> #include <map> #include <algorithm> #include <iterator> using namespace std; bool cmp(const pair<int, int> &p1, const pair<int, int> &p2) { return p1.second < p2.second; } int main() { map<int, int> m; for(int i = 0; i < 10; ++i) m[i] = i * -i; vector<pair<int, int> > v; copy(m.begin(), m.end(), back_inserter(v)); sort(v.begin(), v.end(), cmp); for(int i = 0; i < v.size(); ++i) cout << v[i].first << " : " << v[i].second << endl; return 0; }


Puede usar un mapa (o conjunto) diferente y usar la transformación para hacer la clasificación al insertar:

#include <map> #include <algorithm> typedef std::map<unsigned int, signed char> MapType1; typedef std::map<MapType1::mapped_type, MapType1::key_type> MapType2; struct SwapPair { MapType2::value_type operator()(MapType1::value_type const & v) { return std::make_pair (v.second, v.first); } }; int main () { MapType1 m1; for(int i = 0; i < 10; ++i) m1[i] = i * -i; MapType2 m2; std::transform (m1.begin () , m1.end () , std::inserter (m2, m2.end ()) , SwapPair ()); }

Olvidé agregar que si necesita hacer esto mucho, entonces sería mejor usar un contenedor multi-index impulso.


Si está utilizando un std :: map, ya está ordenado por la clave. Simplemente cree un iterador e itere sobre el mapa desde begin () hasta end () y listo.

Si desea ordenar por otra cosa que no sea la clave del mapa, puede usar el mismo iterador y colocar una copia de cada elemento en su vector a medida que itera sobre el mapa.


Si su propósito es simplemente ordenar por tipo en lugar de la clave, es posible que desee ver Boost::Bimap . Le permite acceder a ambas partes del par de mapas como claves. Probablemente podría iterar sobre él en orden de la segunda clave tan fácilmente como la primera.


Suponiendo que desea copiar la clave y el valor:

std::map<Foo, Bar> m; // Map gets populated // (...) // Copying it to a new vector via the constructor std::vector<std::pair<Foo, Bar>> v(m.begin(), m.end()); // Copying it to an existing vector, erasing the contents v.assign(m.begin(), m.end()); // Copying it to the back of an existing vector v.insert(v.end(), m.begin(), m.end());


Un map almacena un par: una clave y un valor. ¿Qué parte quieres copiar? O, ¿quieres copiar ambos a dos vector distintos?

Quiero copiar los dos. Una vez hecho esto, tengo que averiguar cómo ordenar el vector por el segundo valor en el par.

template <class V> struct sort_by_val { bool operator()(V const& l, V const& r) { return // ... } }; vector<pair<K, V> > outv(map.begin(), map.end()); sort(outv.begin(), outv.end(), sort_by_val());


vector<pair<K,V> > v(m.begin(), m.end());

o

vector<pair<K,V> > v(m.size()); copy(m.begin(), m.end(), v.begin());

copy() está en <algorithm> .