Упорядочить std :: vector структур по двум полям в C ++ - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть std::vector структур для хранения значений x0 и y0. Я хотел бы иметь возможность сортировать векторные элементы, упорядочивая их, начиная с точек с более низкими значениями x0 и y0. В настоящее время я могу только отсортировать их, рассматривая только значения x0 или y0.

    struct Coordinate
    {
        double x0 = 0.0;
        double x1 = 0.0;

        Coordinate(double paramx0, double paramy0) : x0(paramx0), y0(paramy0) {}
    };

 std::vector<Coordinate> coords;
 std::vector<Coordinate> coords_x;
 std::vector<Coordinate> coords_y;  

    bool compareByLength_x(const Coordinate &a, const Coordinate &b)
    {
        return a.x0 < b.x0;
    }

    bool compareByLength_y(const Coordinate &a, const Coordinate &b)
    {
        return a.y0 < b.y0;
    }

    // ... storing values in the vector and then sort it..

    std::sort(coords.begin(), coords.end(), compareByLength_x);

    for (unsigned int i = 0; i < coords.size(); ++i)
    {
       cout << i << " X[0]: " << coords[i].x0 << " Y[0]: " << coords[i].y0 << endl; 
    }

    cout << "\n" << endl;    
    parallel_y(coords.size(), coords);    
    cout << "\n" <<endl;


    std::sort(coords.begin(), coords.end(), compareByLength_y);

    for (unsigned int i = 0; i < coords.size(); ++i)
    {
       cout << i << " X[0]: " << coords[i].x0 << " Y[0]: " << coords[i].y0 << endl; 
    }

    cout << "\n" << endl;    
    parallel_x(coords.size(), coords);    
    cout << "\n" <<endl;

Например, если вектор содержит:

125, 140
125, 32
125, 196
164, 38
10, 38

тогда оно должно стать:

10, 38
125, 32
125, 140
125, 196
164, 38

, сначала проверяя самое низкое значение x0, а затем, для тех же значений x0, ища самые низкие значения y0.

Как я могу это реализовать? Могу ли я использовать одну функцию?

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

Поскольку C ++ 11 std::tie из <tuple> можно использовать для удобства проведения лексикографических сравнений с участием многих членов:

bool compareByLength_xy(const Coordinate& a, const Coordinate& b)
{
    return std::tie(a.x0,a.y0) < std::tie(b.x0,b.y0);
}

Хитрость заключается в создании кортежей и кортежи уже реализуют желаемое сравнение. Обратите внимание, что ссылка выше имеет пример, где std::tie используется именно для этого.

0 голосов
/ 14 апреля 2020

Да, единственная функция. Просто закодируйте логи c, которые вы совершенно правильно описали выше

bool compareByLength_x_and_y(const Coordinate &a, const Coordinate &b)
{
    return a.x0 < b.x0 || (a.x0 == b.x0 && a.y0 < b.y0);
}
...