排序矢量的矢量

时间:2014-08-23 02:33:51

标签: c++ stl

我知道已经有几个问题,我相信我尝试了所有建议的解决方案,但仍然遇到问题。我的内部向量是大小为3的行,我需要根据第0列对外部向量进行排序,第0列是向量中每行的第一个元素,然后是1,2。

代码:

vector < vector<double> > ftstPrices;

for (int i=0; i<n;i++)
{
    vector <double> stepPrices;

    for (j=0 ;j<1259;j++)
    {
        stepPrices.push_back(.......);
    }//end of for price simu

    stepPrices.erase(stepPrices.begin(),stepPrices.begin()+251);
    stepPrices.erase(stepPrices.begin()+1,stepPrices.begin()+252);
    stepPrices.erase(stepPrices.begin()+2,stepPrices.begin()+757);
    ftstPrices.push_back(stepPrices);//push the inner vector into outer

    /* this is the tricky part im having issues with */
    sort(ftstPrices.begin(),ftstPrices.end(), [](const vector<double>&x,const vector<double>&y) {
            return stepPrices[0]<stepPrices[0]
            });
}

错误:

C:\CPP\Projects\monteCarlo\simulations.cpp|68|error: 'stepPrices' is not captured|
C:\CPP\Projects\monteCarlo\simulations.cpp|68|error: 'stepPrices' is not captured|
C:\CPP\Projects\monteCarlo\simulations.cpp|68|error: expected ';' before '}' token|
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\stl_algo.h||In instantiation of 'void 

按要求输入和输出示例      column1 column2 column3

 83.0201  13.3513  24.56
 15.8398  43.3559  9.66
 28.9211  38.8552  32.33
 22.8481  45.9503  8.45
 6.20375  16.6046  11.95

StepPrices是添加到ftstPrices向量

的行

排序后,矢量应如下所示      column1 Column2 Column3

 6.20375  13.3513  8.45
 15.8398  16.6046  9.66
 22.8481  38.8552  11.95
 28.9211  43.3559  24.56
 83.0201  45.9503  32.33

2 个答案:

答案 0 :(得分:0)

使用Boost.Range很容易。

我们需要的是随机访问范围(对于sort()),其元素每个都映射到原始范围的相应元素内的单个元素。所以我们可以编写一个转换函子:

template<std::size_t N>
struct select_element
{
    template<class T>    
    typename T::reference operator()(T& source) const { return source[N]; }
};

请注意,operator ()会返回对容器value_type的引用,以启用修改。

现在我们可以将它与transformed范围适配器一起使用:

using boost::adaptors::transformed;

std::vector<std::vector<double>> input = /* ... */;

boost::sort(input | transformed(select_element<0>()));
boost::sort(input | transformed(select_element<1>()));
boost::sort(input | transformed(select_element<2>()));

Demo

如果您不能使用Boost,概念上最简单的方法是将每列收集到单独的向量中,对列进行排序,然后从已排序的列中重新生成行。

答案 1 :(得分:0)

您可以使用旧的std::sort()来定义比较器:

struct DataRowComparatorByColumnIndex {
  bool operator() ( const std::vector<double>& row1,
                    const std::vector<double>& row2 ) {
      return row1[m_columnIndex] < row2[m_columnIndex] ;
  }
  uint m_columnIndex;
};

然后使用它对表格/数据框/矩阵进行排序:

std::vector< std::vector<double> > table = /* ... */;

// Sort the data by given column.
DataRowComparatorByColumnIndex dataRowComparatorByColumnIndex;
dataRowComparatorByColumnIndex.m_columnIndex = 2; //sort by 3rd column
std::sort( result.begin(), result.end(), dataRowComparatorByColumnIndex );