为什么std :: sort假定std :: vector&lt; std :: vector <int>&gt;默认情况下是一个std :: vector,从而产生错误的结果?

时间:2017-01-07 21:15:55

标签: c++ sorting c++11 vector stl

我已经创建了一个向量向量,我想根据我定义的参数对它们进行排序。这里,sort()函数将定义为vector<vector<int>>的变量数据集仅作为vector<int>。有人可以解释出了什么问题吗?

此外,即使在上述问题被解决之后,compare()函数也仅适用于硬编码索引。如果我想根据不同的指数对它进行排序,我应该怎么做呢。有没有一种方法可以提及呢?

#include <iostream>
#include <vector>
#include <algorithm>

//void check_function(std::vector <std::vector <int> > *dataset)
//{
//    std::cout<<(*dataset)[0].size()<<std::endl;
//}

bool compare(const std::vector <std::vector <int> > &a, const std::vector <std::vector <int> > &b)
{
    return a[1] < b[1];
}

/* This works, but this sorts based on the first parameter of the vector rather than what I mention.
bool compare(const std::vector <int> &a, const std::vector <int> &b)
{
    return a < b;
}
*/    
int main()
{
    std::vector <int> data;
    std::vector <int> data2;
    std::vector <std::vector <int> > dataset;

    data.push_back(5);
    data.push_back(10);
    dataset.push_back(data);

    data2.push_back(5);
    data2.push_back(20);
    dataset.push_back(data2);

//    check_function(&dataset);
    std::sort(dataset.begin(), dataset.end(), compare);
    std::cout<< dataset[0][0]<<std::endl;

    return 0;
}

1 个答案:

答案 0 :(得分:1)

对容器进行排序,您需要一个比较容器中包含的元素对的函数。

因此,排序std::vector<std::vector<int>>,您需要一个能够接收std::vector<int>夫妇的函数。

但是您的compare()会收到几个std::vector<std::vector<int>>

这是错误的。

关闭主题:您的compare()函数(恕我直言)非常危险,因为访问两个向量的第二个元素而不检查它们是否包含至少两个元素。

我认为你应该至少使用at()代替operator[];只是为了执行一个绑定的cecking,以防万一,获得一个可捕获的异常;

之类的东西
bool compare(const std::vector <int> & a, const std::vector <int> & b)
{
    return a.at(1) < b.at(1);
}

---编辑---

OP问

  

如何根据运行时决定的索引对其进行排序?

决定如何?在哪里?

假设在compare()之外(在例如调用std::sort()的函数中)决定,你可以使用lambda函数。

一个例子

#include <iostream>
#include <vector>
#include <algorithm>

int main()
 {
   std::vector <std::vector <int> > dataset;

   dataset.emplace_back(std::initializer_list<int>{200, 1});
   dataset.emplace_back(std::initializer_list<int>{5, 56});

   auto val = 1U;

   std::sort(dataset.begin(), dataset.end(),
             [val](const std::vector <int> &a, const std::vector <int> &b)
              { return  a.at(val) < b.at(val); });

   std::cout << dataset[0][0] << ", " << dataset[0][1] << std::endl;

   return 0;
 }