2016-04-07 3 views
1

У меня есть 2d вектор массив, который содержит:Сортировка 2D массива векторов на основе столбца

row id r b main 
    1  0 26 3 
    2  1 11 2 
    3  1 46 4 
    4  2 26 1 
    5  3 11 2 

Я хочу, чтобы сортировать каждую строку на основе его "main"-column значения меньше "main"-column. меньшее значение => вся строка должна быть сверху.

если есть буксирные ряды или больше, и там "main"-column имеют такое же значение, я хочу проверить "r"-column. меньшее значение => вся строка должна быть сверху.

после сортировки будет выглядеть следующим образом:

row id r b main 
    4  2 26 1 
    2  1 11 2 
    5  3 11 2 
    1  0 26 3 
    3  1 46 4 

ответ

3

Попробуйте использовать std::sort нравится

using int_arr = std::array<int, 4>; 
std::sort(std::begin(arr), std::end(arr), [](const int_arr& a, const int_arr& b){ 
    return a[3] != b[3] ? a[3] < b[3] : a[1] < b[1]; 
}); 

Demo

#include <iostream> 
#include <array> 
#include <algorithm> 

int main() { 
    using int_arr = std::array<int, 4>; 
    int_arr arr[5] = { 
     {1, 0, 26, 3}, 
     {2, 1, 11, 2}, 
     {3, 1, 46, 4}, 
     {4, 2, 26, 1}, 
     {5, 3, 11, 2} 
    }; 

    for(const auto& i_arr : arr) { 
     for(const auto& i : i_arr) 
      std::cout<< i <<", "; 
     std::cout << "\n"; 
    } 

    std::cout << "**************\n"; 

    std::sort(std::begin(arr), std::end(arr), [](const int_arr& a, const int_arr& b){ 
     return a[3] != b[3] ? a[3] < b[3] : a[1] < b[1]; 
    }); 

    for(const auto& i_arr : arr) { 
     for(const auto& i : i_arr) 
      std::cout<< i <<", "; 
     std::cout << "\n"; 
    } 
} 

Выходной

1, 0, 26, 3, 
2, 1, 11, 2, 
3, 1, 46, 4, 
4, 2, 26, 1, 
5, 3, 11, 2, 
************** 
4, 2, 26, 1, 
2, 1, 11, 2, 
5, 3, 11, 2, 
1, 0, 26, 3, 
3, 1, 46, 4, 
Смежные вопросы