在一个array-c ++中排序多个字段

时间:2014-05-24 14:00:36

标签: c++ sorting

我想对第三列的值进行排序,同时,第一列和第二列的值与使用数组的第三列的位置相同。

例如

排序前

2 30 2000
1 40 1000
3 10 4000
5 20 3000
4 50 5000

排序后

1 40 1000
2 30 2000
5 20 3000
3 10 4000
4 50 5000

我知道可以通过使用vector和std :: sort来完成,但是可以使用数组来实现相同的结果吗?

1 个答案:

答案 0 :(得分:5)

您可以使用std::sort对数组进行排序,您可以使用std::beginstd::end获取开头和结尾的迭代器以传递给sort,您可以使用std::tuple提供比较功能。

std::vector与此任务的原始数组之间没有特别相关的区别。

示例代码:

#include <algorithm>        // std::sort
#include <iterator>         // std::begin, std::end
#include <iostream>         // std::cout, std::endl
#include <tuple>            // std::tie
using namespace std;

struct Triplet { int values[3]; };

template< int n >
void display( Triplet const (&array)[n] )
{
    for( auto const& t : array )
    {
        cout << t.values[0] << ' ' << t.values[1] << ' ' << t.values[2] << endl;
    }
}

auto main()
    -> int
{
    Triplet array[]  =
    {
        { 2, 30, 2000 },
        { 1, 40, 1000 },
        { 3, 10, 4000 },
        { 5, 20, 3000 },
        { 4, 50, 5000 }
    };

    auto const triplet_less = []( Triplet const& a, Triplet const& b ) -> bool
    {
        return 
            (tie( a.values[2], a.values[0], a.values[1] ) <
                tie( b.values[2], b.values[0], b.values[1] ));
    };

    cout << "Original data: " << endl;
    display( array );

    sort( begin( array ), end( array ), triplet_less );

    cout << endl;
    cout << "Sorted data: " << endl;
    display( array );
}