排序矢量矢量

时间:2013-01-19 22:23:58

标签: c++ stl vector

我有

    vector<vector<int>> vec 

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

每个整数向量作为&#34; big&#34;的元素。 vector有4个INT值。 我想根据它的内容向量(我的意思是每个&#34;内部&#34;向量第三个元素)对vec进行排序 - 是否可能?

修改

让我们说我有一个功能

COST(vector<int>)

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

4 个答案:

答案 0 :(得分:23)

当然可以。 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];
});

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


对编辑的回复:只需将COST功能应用于ab

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

答案 1 :(得分:4)

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

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

注意:

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

答案 2 :(得分: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/

答案 3 :(得分:0)

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

comp在哪里:

static bool comp(const vector<int>& vec1, const vector<int>& vec2){
    return vec1[2] < vec2[2];
}