19

我有

    vector<vector<int>> vec 

在我的 C++ 应用程序中。

每个整数向量作为“大”向量的一个元素都有 4 个 INT 值。我想根据它的 ints 内容向量的第三个值对 vec 进行排序(我的意思是每个“内部”向量第三个元素) - 可能吗?

编辑

假设我有一个函数

COST(vector<int>)

它根据我的向量值计算出一些值 - 我也可以在比较参数中使用它吗?它会帮助我更多。

4

4 回答 4

47

是的。std::sort可以带第三个参数,这是排序时使用的比较函数。例如,您可以使用 lambda 函数:

std::vector<std::vector<int>> vec;
// Fill it

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

或者,您可以传递任何其他可使用 signature 调用的内容bool(const std::vector<int>&, const std::vector<int>&),例如仿函数或函数指针。


对编辑的回应:只需将您的COST功能应用于aand b

std::sort(vec.begin(), vec.end(),
          [](const std::vector<int>& a, const std::vector<int>& b) {
  return COST(a) < COST(b);
});
于 2013-01-19T22:28:31.777 回答
4

如果您想按成本比较两个向量,请尝试以下操作:

bool predicate(const std::vector<int>& a, const std::vector<int>& b)
{
    return COST(a) < COST(b);
}

笔记:

  • 以上也适用于 C++98,我不确定 C++11 的使用范围有多广,以及您是否有兼容的编译器。否则,您当然也可以按照 sftrabbit 的建议使用 lambda 表达式。
  • 您没有说 COST 返回什么,我只是假设一些可排序的值,例如 float 或 long。
  • 我希望您在将向量传递给 COST() 时不要复制向量,那样效率会非常低。
  • COST 建议使用一个宏,就像所有的 UPPERCASE_NAMES 一样。不要使用宏。不要为函数使用宏名称。
于 2013-01-19T23:14:41.443 回答
2

sort(vec.begin(), vec.end(), comp);

哪里comp是:

static bool comp(const vector<int>& vec1, const vector<int>& vec2){
    return vec1[2] < vec2[2];
}
于 2020-10-11T18:17:56.420 回答
1
#include <vector>
#include <algorithm>
#include <cstdlib>
#include <ctime>

using namespace std;

// This makes the sort be according to column 2 and ascending
bool sortFunc( const vector<int>& p1,
           const vector<int>& p2 ) {
 return p1[1] < p2[1];
 }

int main() {

  srand(time(NULL));

  // Creates and initializes 10 x 4 vector
  vector< vector<int> > vec;
  for( int i=0; i<10; i++ ) {
   vector<int> tmpVec;
   for( int j=0; j<2; j++ ) {
  tmpVec.push_back( rand()%10 );
   }
   vec.push_back( tmpVec );
  }

  // Print out the pre-sorted vector
 cout << "Pre-sorting state:" << endl;
  for( int i=0; i<vec.size(); i++ ) {
   for( int j=0; j<vec[i].size(); j++ ) {
  cout << vec[i][j] << " ";
  }
cout << endl;
}
  cout << endl;

  // Do the sorting according to column 2
  sort(vec.begin(), vec.end(), sortFunc);

  // Print out the post-sorted vector
   cout << "Post-sorting state:" << endl;
   for( int i=0; i<vec.size(); i++ ) {
    for( int j=0; j<vec[i].size(); j++ ) {
  cout << vec[i][j] << " ";
    }
   cout << endl;
   }

  return 0;
  }

来源:https ://shihho.wordpress.com/2012/11/28/sort_with_vectors/

于 2015-11-24T16:30:58.797 回答