Сортировка вектора вместе с другим вектором в C ++ - PullRequest
2 голосов
/ 08 февраля 2012

Я пишу функцию в C ++, которая будет принимать 2 вектора значений типа double, называемых xvalues ​​и yvalues.Моя цель - создать интерполяцию с этими входами.Однако было бы очень удобно, если бы пары (x, y) были отсортированы так, чтобы значения x находились в возрастающем порядке, а значения y по-прежнему соответствовали правильному значению x.

Кто-нибудь знаеткак я могу сделать это эффективно?

Ответы [ 4 ]

3 голосов
/ 08 февраля 2012

Я бы, наверное, создал вектор пар и отсортировал бы его любыми необходимыми средствами.

Звучит как абстракция данных (2 отдельных набора для значений, которые на самом деле «связаны», неверны).

2 голосов
/ 08 февраля 2012

В качестве альтернативы вы можете написать какой-то адаптер итератора, который внутренне содержит два итератора и увеличивает / уменьшает / назначает их одновременно.Они обращаются к специальному типу, который при свопировании меняет два значения в обоих векторах, а при сравнении сравнивает только одно.Это может быть какая-то работа (дополнительная замена, op <, class), но когда она сделана как шаблон, и вам это нужно чаще, вы можете заплатить. </p>

1 голос
/ 08 февраля 2012

Идея проста: реализовать алгоритм сортировки (например, быстрая сортировка проста, короткое ОК для большинства случаев использования - доступно множество реализаций: http://www.java -samples.com / showtutorial.php? Tutorialid =445 ).

  • Выполните сравнение по вашему x-вектору, а
  • сделайте своп по обоим векторам.

Метод сортировки должен принимать оба вектора на вход, но это должно быть второстепенным вопросом.

1 голос
/ 08 февраля 2012

Или вы используете вектор пар, который вы затем можете легко отсортировать с помощью алгоритма сортировки stl , или вы пишете свой собственный метод сортировки. Поэтому у вас есть несколько вариантов . В вашем собственном алгоритме сортировки вы можете позаботиться не только о сортировке вашего x-вектора, но и y-вектора соответственно.

Здесь в качестве примера используется пузырьковая сортировка для двух векторов (vec1 и vec2).

bool bDone = false;
while (!done) {
    done = true;
    for(unsigned int i=0; i<=vec1.size()-1; ++i) {
        if ( vec1.at(i) > vec1.at(i+1) ) {
            double tmp   = vec1.at(i);
            vec1.at(i)   = vec1.at(i+1);
            vec1.at(i+1) = tmp;
            tmp          = vec2.at(i);
            vec2.at(i)   = vec2.at(i+1);
            vec2.at(i+1) = tmp;
            done = false;
        }
    }
}

Но опять же, как уже отмечали другие, вы должны использовать std::vector< std::pair<double, double> > и просто отсортировать его.

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