如何根据其值的属性对向量进行排序?

时间:2014-06-16 12:56:48

标签: c++ vector

如果我有一对配对

vector<pair<int,vector<int>>> myvector;

如何根据内部向量的第n个元素对此向量进行排序?

我的previously-asked question on this topic包含通过使用预定义的 sorting_function()按照对的第二个元素对对矢量进行排序的答案,如下所示。但是,在这种情况下,我不知道 sorting_function()的形式应该是什么......

sort(v.begin(), v.end(), sorting_function());

2 个答案:

答案 0 :(得分:1)

您可以从我对上一个问题的回答中重复使用比较器; sort需要一个实例,所以传递一个临时的:

std::sort(v.begin(), v.end(), MyComparator<1>());

所以,这是完整的例子:

template <std::size_t N>
struct MyComparator
{
   typedef std::pair<int, std::vector<int>> value_type;
   bool operator()(const value_type& lhs, const value_type& rhs)
   {
      return lhs.second.at(N) < rhs.second.at(N);
   }
};

/**
 * A set of (int, int{2,}) pairs, sorted by the 2nd element in
 * the 2nd item of each pair.
 */
std::vector<std::pair<int, std::vector<int>>> my_data;

int main()
{
    my_data.push_back(std::make_pair(1, std::vector<int>{0,5,0,0}));
    my_data.push_back(std::make_pair(2, std::vector<int>{0,2,0,0}));
    my_data.push_back(std::make_pair(3, std::vector<int>{0,1,0,0}));
    my_data.push_back(std::make_pair(4, std::vector<int>{0,9,0,0}));

    std::sort(my_data.begin(), my_data.end(), MyComparator<1>());

    for (const auto& el : my_data)
        std::cout << el.first << ' ';
}

// Output: 3 2 1 4

live demo

答案 1 :(得分:0)

struct comparator
{
    comparator (int n) : n(n) { }

    typedef std::pair<int, std::vector<int>> key_type;

    bool operator() (key_type const & k1, key_type const & k2)
    {
        return k1.second[n] < k2.second[n];
    }

    int n;
};

我不知道你想从哪里来,但基本上就是这样。你也应该在其中加入边界检查。

然后你可以这样对数组进行排序:

std::sort(v.begin(), v.end(), comparator(n));