0

次のように宣言されたベクトルがあります。

vector<vector<vector<int> > > myVector (148995,vector<vector<int> >(7,vector <int>(6,0)));

std::sort を使用してソートできるようにしたいと思います。

Myvector[x][y][z] の y = 5 の値で y のすべての値を並べ替えたい

一度に 1 つの z をソートできるようにしたい (z 値は 0 から 5 まで可能)、独立した 2d ベクトルとしてソートしようとし、Myvector[x][y] しか持っていませんが、常にコンパイルされますそうしている間にエラー。

別のスタックオーバーフローの質問でこのコードを見つけましたが、これは 2 次元ベクトルで機能しますが、プログラミング スキルが限られているため、3 次元ベクトルに変換することはできません。

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

ありがとう、カヴェン

編集

myVector[x][y][z]
Myvector[x] = {0,1,2,3,...,200 000}
myvector[0][y][0] = {44,30,21,15,1,600,25} 
myvector[1][y][0] = [25,24,10,7,1,700,30}
myvector[0][y][2] = {34,20,11,6,1,400,25} 
myvector[1][y][2] = [33,24,10,7,1,300,40}

すべての x の myvector[x][y][z] を y = 5 の値でソートし、すべての 'y' 値を z = 0 でソートするとします (z は 0 から 5 まで変化する可能性があります)。

私が好きな並べ替えを使用し、それを z = 0 で使用すると、

myvector[1][y][0] = {44,30,21,15,1,600,25} 
myvector[0][y][0] = [25,24,10,7,1,700,30}
myvector[0][y][2] = {34,20,11,6,1,400,25} 
myvector[1][y][2] = [33,24,10,7,1,300,40}
4

2 に答える 2

2

質問を正しく理解しているかどうかはわかりませんが、各行列の整数要素 M[y][z] で行列のベクトルを並べ替えるだけなら、次のコードが必要だと思います。

#include <vector>
#include <algorithm>

using namespace std;

using Row      = vector<int>;
using Matrix   = vector<Row>;
using Matrices = vector<Matrix>;

/// Sort a vector of matrices on element M[y][z] of each of the matrices.
/// terminology: y and z as in original question
void sort_on( Matrices &matrices, int y, int z)
{
    sort( 
        matrices.begin(), matrices.end(), 
        [y,z](const Matrix &lhs, const Matrix &rhs)
        {
            return lhs[y][z] < rhs[y][z];
        });  
}

int main()
{
    Matrices myVector( 100000, Matrix( 7, Row(6,0)));
    
    sort_on( myVector, 5, 0); // sort on M[5][0]
    sort_on( myVector, 5, 5); // sort on M[5][5]
}
于 2013-07-03T21:53:56.253 に答える
2

std::sort とソートに使用する関数を使用する必要があります。私があなたを正しく理解していれば、2 番目または 3 番目の次元に基づいて並べ替えたいと考えています。

bool comparison_function(const std::vector<std::vector<int> >& v1, 
                         const std::vector<std::vector<int> >& v2) {
  // calculate some comparison_result
  return comparison_result
}

この関数を使用すると、std::sort を呼び出すことができます。

std::sort(myVector.begin(), myVector.end(), comparison_function);

比較がかなり複雑な場合は、 comparison_function の代わりにファンクターを使用して状態を注入する必要があります。

于 2013-07-03T22:03:18.930 に答える