para - C++ cómo copiar un mapa a un vector
mapa en c++ (7)
Esta pregunta ya tiene una respuesta aquí:
- Copie std :: map into std :: vector de pares 3 respuestas
¿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>
.