Оператор сортировки не работает в 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поместите их в отдельные массивы (еще лучше, используйте vectors) и отсортировать первый вектор. Затем выполните итерации обоих векторов и создайте новый набор пар.

Другие вопросы по тегам