19

私は持っています

    vector<vector<int>> vec 

私のc++アプリで。

「大きな」ベクトルの要素としての整数のすべてのベクトルには、4つのINT値があります。intsのコンテンツベクトルの3番目の値に基づいてvecを並べ替えたい(つまり、すべての「内部」ベクトルの3番目の要素を意味します)-それは可能ですか?

編集

関数があるとしましょう

COST(vector<int>)

これは、ベクトル値に基づいていくつかの値を計算します-比較パラメーターでも使用できますか?それは私をもっと助けてくれるでしょう。

4

4 に答える 4

47

もちろんそうだ。std::sortソート時に使用する比較関数である3番目のパラメーターを取ることができます。たとえば、ラムダ関数を使用できます。

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関数をaとに適用するだけ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

2つのベクトルをコストで比較する場合は、次のことを試してください。

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

ノート:

  • 上記はC++98でも機能しますが、C ++ 11の使用がどれほど普及しているか、および準拠したコンパイラーを使用しているかどうかはわかりません。それ以外の場合は、sftrabbitが提案したように、もちろんラムダ式を使用することもできます。
  • 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 に答える