Tengo dos matrices values
y keys
ambas de la misma longitud. Quiero clasificar por clave la matriz values
usando la matriz keys
como claves. Me han dicho que el iterador zip del boost es la herramienta correcta para que bloquea dos arreglos juntos y les hace cosas al mismo tiempo.boost zip_iterator y std :: sort
Aquí está mi intento de utilizar el boost :: zip_iterator para resolver el problema de ordenación que no se puede compilar con gcc
. ¿Alguien puede ayudarme a arreglar este código?
El problema radica en la línea
std::sort (boost::make_zip_iterator(keys, values ), boost::make_zip_iterator(keys+N , values+N));
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#include <vector>
#include <algorithm>
#include <boost/iterator/zip_iterator.hpp>
#include <boost/tuple/tuple.hpp>
#include <boost/tuple/tuple_comparison.hpp>
int main(int argc, char *argv[])
{
int N=10;
int keys[N];
double values[N];
int M=100;
//Create the vectors.
for (int i = 0; i < N; ++i)
{
keys[i] = rand()%M;
values[i] = 1.0*rand()/RAND_MAX;
}
//Now we use the boost zip iterator to zip the two vectors and sort them "simulatneously"
//I want to sort-by-key the keys and values arrays
std::sort (boost::make_zip_iterator(keys, values ),
boost::make_zip_iterator(keys+N , values+N )
);
//The values array and the corresponding keys in ascending order.
for (int i = 0; i < N; ++i)
{
std::cout << keys[i] << "\t" << values[i] << std::endl;
}
return 0;
}
NOTA: Mensaje de error en la compilación
g++ -g -Wall boost_test.cpp
boost_test.cpp: In function ‘int main(int, char**)’:
boost_test.cpp:37:56: error: no matching function for call to ‘make_zip_iterator(int [(((unsigned int)(((int)N) + -0x00000000000000001)) + 1)], double [(((unsigned int)(((int)N) + -0x00000000000000001)) + 1)])’
boost_test.cpp:38:64: error: no matching function for call to ‘make_zip_iterator(int*, double*)’
Como se ha señalado por Carl-cocinero, no es más reciente (por duplicado) [pregunta] (http://stackoverflow.com/questions/13840998/sorting-zipped-locked-containers-in-c-using -boost-or-the-stl) en el que se proporciona una solución de trabajo. También tenga en cuenta que la biblioteca de rango de Eric Niebler proporciona view :: zip que [simplemente funciona] (http://stackoverflow.com/a/32720638/554283). Dicha biblioteca ha sido propuesta para estandarización. –