Оператор сортировки не работает в C++
У меня проблемы с использованием оператора сортировки, поскольку мне нужно отсортировать только первый элемент в паре. Код прост, но не работает:
Оператор определен в:
struct sort_pred {
bool operator()(const CromosomaIndex &left, const CromosomaIndex &right) {
return left.first < right.first;
}
};
и тип
typedef std::pair<double,int> CromosomaIndex;
Я пытаюсь отсортировать массив следующим образом:
CromosomaIndex nuevo[2];
nuevo[0].first = 0.01;
nuevo[0].second = 0;
nuevo[1].first = 0.009;
nuevo[1].second = 1;
int elements = sizeof(nuevo) / sizeof(nuevo[0]);
sort(nuevo, nuevo+ elements, sort_pred());
Но проблема в том, что это сортировка первого и второго элемента, и я хочу отсортировать только первый элемент и оставить второй фиксированным. Какие-нибудь мысли?
3 ответа
Я не уверен, что вы поняли ответ на другой вопрос, но вы хотите, чтобы вся пара была переупорядочена в соответствии с double
значение. Исходный индекс (int
) должен быть прикреплен к double
это было в этом месте в исходном векторе, чтобы вы могли восстановить местоположение. Обратите внимание, что если вы отсортировали только double
в пределах pair
, то значение int
будет местоположение в массиве... который вообще не должен поддерживаться в качестве данных.
Кроме того, вы можете рассмотреть аналогичное (хотя и немного другое) решение. Создайте один вектор целых чисел, который инициализируется значениями в диапазоне [0..N)
где N
размер вектора двойников. Затем отсортируйте вектор индексов, используя функтор сравнения, который вместо того, чтобы смотреть на значение (int
) пройденный проверит значение в оригинале double
вектор:
struct dereference_cmp {
std::vector<double> const & d_data;
dereference_cmp( std::vector<double> const & data ) : d_data(data) {}
bool operator()( int lhs, int rhs ) const {
return d_data[lhs] < d_data[rhs];
}
};
std::vector<double> d = ...;
std::vector<int> ints;
ints.reserve( d.size() );
for ( int i = 0; i < d.size(); ++i ) ints.push_back(i);
std::sort( d.begin(), d.end(), dereference_cmp(d) );
При таком подходе обратите внимание, что не переупорядочиваются double
с, а точнее вектор индексов. После sort
завершает вектор индексов будет содержать местоположения в вектор double
такой, что i < j
=> d[ ints[i] ] <= d[ ints[j] ]
,
Обратите внимание, что во всем процессе, что вы хотите переупорядочить, это индексы (в первоначальном подходе, чтобы иметь возможность восстановить несортированный вектор, в этом подходе, чтобы быть в состоянии найти значения в отсортированном порядке), и оригинальный вектор есть только предоставить критерий для сортировки.
Также обратите внимание, что единственной причиной для сортировки только индексов, а не измененного контейнера с указанием значения и индекса, было бы то, что стоимость перемещения данных была высокой (скажем, что каждый элемент данных - это большой объект, который нельзя перемещать дешево, так как структура, содержащая массив - не вектор - данных).
Если вы хотите, чтобы результаты зависели от исходного заказа, используйте std::stable_sort
,
Этот подход сортирует пары как единое целое, и это то, что от него ожидается: никогда не имеет смысла разбивать first
и second
пары. Если вы хотите отсортировать только first
пункт и оставить second
на месте вы получите другой набор пар.
Если вы хотите отсортировать first
отдельно от second
поместите их в отдельные массивы (еще лучше, используйте vector
s) и отсортировать первый вектор. Затем выполните итерации обоих векторов и создайте новый набор пар.