У меня есть два массива values
и keys
обеих одинаковой длины. Я хочу сортировать по ключу массив values
с использованием массива keys
в виде ключей. Мне сказали, что zip-истребитель boost - это просто инструмент для , фиксирующий два массива вместе и делая материал для них одновременно.boost zip_iterator и std :: sort
Вот моя попытка использовать boost :: zip_iterator для решения проблемы сортировки, которая не скомпилируется с gcc
. Может кто-нибудь помочь мне исправить этот код?
Проблема заключается в линии
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;
}
Примечание: Сообщение об ошибке на компиляции
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*)’
Как отметил КАРЛ-повара, есть более поздние (дубликат) [вопрос] (http://stackoverflow.com/questions/13840998/sorting-zipped-locked-containers-in-c-using -boost-or-the-stl), в котором дается рабочее решение. Также обратите внимание, что библиотека диапазонов Eric Niebler предоставляет view :: zip, который [просто работает] (http://stackoverflow.com/a/32720638/554283). Указанная библиотека была предложена для стандартизации. –