如何std ::排序3维向量

时间:2013-07-03 21:17:17

标签: c++ sorting vector multidimensional-array

我有一个声明如下的向量:

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

我希望能够使用std :: sort来对其进行排序。

我希望在Myvector [x] [y] [z]

中按y = 5的值对y的所有值进行排序

我希望能够一次排序一个z(z值可以从0到5),我试图将其排序为独立的2d向量并且只有Myvector [x] [y]但是我这样做总是会出现编译错误。

我在另一个适用于2d矢量的stackoverflow问题上找到了这个代码,但我的有限编程技巧不允许我将其转换为3d矢量:

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

修改

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}

如果我按y = 5的值对所有x的myvector [x] [y] [z]进行排序,并对所有'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}

2 个答案:

答案 0 :(得分:2)

您应该使用std :: sort和用于排序的函数。如果我理解正确,你想根据第二或第三维进行排序。

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);

如果您的比较相当复杂,那么您应该使用仿函数而不是compare_function来注入状态。

答案 1 :(得分:1)

我不确定我是否正确理解了这个问题,但如果您只想在每个矩阵的整数元素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]
}