«Блокировка» двух векторов и их сортировка - PullRequest
9 голосов
/ 16 ноября 2011

У меня есть эти два vector<double> mass и velocity одинакового размера N.Они содержат информацию о массе и скорости N частиц.mass[i] и velocity[i], таким образом, являются свойствами i-й частицы

Возможно ли в C ++ "заблокировать" эти два вектора вместе и отсортировать их в порядке возрастания массы?Таким образом, после сортировки вектор mass должен быть в порядке возрастания, а вектор скорости должен содержать соответствующие скорости отсортированных масс

например, перед сортировкой массы = (4,2,1,3) и скорости= (13, 14,15,16) После сортировки массы = (1,2,3,4) и скорости = (15, 14, 16, 13)

Один (неэффективный) способ Iдля этого нужно передать данные в вектор структуры

struct particle
{

double mass;
double velocity;


bool operator < (const particle& str) const

 {
    return (mass < str.mass);
  }



};

и создать vector<particle> particlelist(N), а затем отсортировать этот вектор, используя std::sort, перегружая оператор <, как я это делал вопределение выше.

Я не хочу помещать свои данные в моду Array of Structures, так как слышал, что они неэффективны по сравнению с подходом Structure of Arrays (по крайней мере, в CUDA).

Ответы [ 3 ]

10 голосов
/ 16 ноября 2011

Создание векторных индексов; заполните его значениями 0..n-1, чем

    struct CmpMass {
    {
       CmpMass(vector<double>& vec) : values(vec){}
       bool operator() (const int& a, const int& b) const
       {
           return values[a] < values[b];
       }
       vector<double>& values;
    }

sort(indexes.begin(), indexes.end(), CmpMass(mass));

чем у вас в порядке векторных индексов элементов в обоих массивах. Чем вы можете создавать векторы массы / скорости в правильном порядке или конвертировать индекс во время доступа: масса [indexes [i]], скорость [indexes [i]]

5 голосов
/ 16 ноября 2011

Почему бы вам не использовать std::pair, так как у вас есть два значения, которые связаны, вы можете затем реализовать свой собственный метод / функцию сравнения для передачи функции std::sort через указатель ( существует перегруженная версия std::sort, которая поддерживает это).

Но убедитесь, что у вас реализован строгий слабый порядок 1011 *, потому что иначе std::sort может привести к SEGFAULT

5 голосов
/ 16 ноября 2011

По крайней мере, насколько мне известно, ни один из алгоритмов сортировки, встроенных в стандартную библиотеку, не сделает это для вас напрямую.Наиболее очевидная возможность, вероятно, заключалась бы в использовании Boost Zip Iterator , чтобы два массива работали как одна коллекция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...