Лямбда-сортировка одного вектора с использованием другого вектора в C ++ - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь отсортировать список индексов int в векторе x2, используя соответствующий двойной вектор x_values.Я использую std :: sort на x2, используя компаратор, который смотрит на x_values.Однако результат не соответствует ожиданиям, и я не могу понять, почему.

Вот пример кода, чтобы показать, о чем я говорю:

#include <iostream>
#include <string>
#include <vector>
#include <numeric>
#include <algorithm>

int main()
{
    int numParticles = 2;
    std::vector<double> x_values(4);

    std::vector<int> x2(4);

    std::iota(x2.begin(), x2.begin() + numParticles, 0);
    std::iota(x2.begin() + numParticles, x2.end(), 0);

    x_values = { -0.3,-0.2,-0.1,1.0 };

    std::cout << "\nx values presort: \n";
    for (int i = 0; i < 4; i++) {
        std::cout << x_values[i] << " " << x2[i] << "\n";
    }

    std::sort(x2.begin(), x2.end(), [&x_values](int i1, int i2) {return x_values[i1] < x_values[i2]; });

    std::cout << "\nx index post sort: \n";
    for (int i = 0; i < 4; i++) {
        std::cout << x2[i] << "\n";
    }
}

Первый вывод дает результат:

x values presort: 
-0.3 0
-0.2 1
-0.1 0
1 1

В то время как второй даетвывод:

x index post sort: 
0
0
1
1

Я ожидал, что второй выдаст вывод:

x index post sort: 
0
1
0
1

Кто-нибудь может увидеть, что я делаю неправильно?

1 Ответ

0 голосов
/ 18 октября 2018

Значение 0 в x2 сортируется так, как если бы оно было x_values[0] иначе -0.3.
Значение 1 в x2 сортируется так, как если бы оно было x_values[1] иначе -0.2.

Итак, отсортированный вектор 0 0 1 1 соответствует -0.3 -0.3 -0.2 -0.2

Я не понимаю вашего замешательства, почему вы ожидали чего-то другого.


Позвольте мне перефразироватьчто делает ваш компаратор:

i1 с x2 предшествует i2 с x2, если x_values[i1] < x_values[i2]

...