C++ 使用类对列上的 2d 向量进行排序失败(带比较功能的问题)

Posted

技术标签:

【中文标题】C++ 使用类对列上的 2d 向量进行排序失败(带比较功能的问题)【英文标题】:C++ sort 2d vector on column using class fails (prob w/ compare function) 【发布时间】:2013-12-31 05:17:17 【问题描述】:

我的 STL 排序比较功能失败。我想传入一个列变量来对列进行排序。我对编程还是新手,所以 Boost 只会让我陷入更多我不明白的事情中。这没有任何错误检查等。 例如

int columnToSort = 1;

sort(vec2d.begin(), vec2d.end(), 
[columnToSort](const vector< int >& a, const vector< int >& b) return a[columnToSort] < b[columnToSort];  );

错误 = 没有匹配函数调用'sort(std::vector >::iterator, std::vector >::iterator, main()::&,...etc..

如果我尝试使它成为一个接受 2dvector 和整数 columnToSort 的类

我得到同样的错误:

以下确实有效:

bool compareFunction0(const vector<int>& a, const vector<int>& b )

    return( a[0] < b[0] );


void vec2dSort( vector< vector<int> > &refVec2d, int sortCol )

    //check to see if sortCol is out of bounds
   sort(refVec2d.begin(), refVec2d.end(), compareFunction0 );

完整来源如下。问题领域是 //////////////////////////////////////////////////////////////////////////// ////////////

#include <iostream>     // std::cout
#include <algorithm>    // std::sort
#include <vector>       // std::vector
#include <cstdlib>      // rand()
#include <ctime>        // rand()

using namespace std;

void printVec2d( vector< vector<int> > &refVec2d )

    vector<int>::iterator itCol;
    vector< vector<int> >::iterator itRow;

    for(itRow = refVec2d.begin(); itRow != refVec2d.end(); ++itRow)
    
       for(itCol = itRow->begin(); itCol != itRow->end(); ++itCol)
          cout << (*itRow)[0] << ":" << *itCol << "\t";
       cout << endl;
    


 bool compareFunction0(const vector<int>& a, const vector<int>& b )
 
     return( a[0] < b[0] );
 
//////////////////////////////////////////////////////////////////////////////////////
//////////////// THIS WORKS but compareFunction0 has hard coded column////////////////
//////////////////////////////////////////////////////////////////////////////////////

void vec2dSort( vector< vector<int> > &refVec2d, int sortCol )

    //check to see if sortCol is out of bounds
    //sort(refVec2d.begin(), refVec2d.end(), [](const vector< int >& a, const vector< int >& b) return a[sortCol] < b[sortCol];  );
   sort(refVec2d.begin(), refVec2d.end(), compareFunction0 );



class SortVec2d

   private:
      int sortCol;
   public:
      SortVec2d( vector< vector<int> >&, int);
      ~SortVec2d();
      bool comparison(const vector<int>&, const vector<int>& );
;

bool SortVec2d::comparison(const vector<int>& a, const vector<int>& b )

   return( a[0] < b[0] ); // I want to do return( a[sortCol] < b[sortCol] )



//////////////////////////////////////////////////////////////////////////////////////
//////////////// THIS DOESN'T WORK "no such comparison function"//////////////////////
//////////////////////////////////////////////////////////////////////////////////////

SortVec2d::SortVec2d( vector< vector<int> > &refVec2d, int sortColumn )

   int sortCol = sortColumn;

   //sort(refVec2d.begin(), refVec2d.end(), comparison );
   //sort(refVec2d.begin(), refVec2d.end(), [](const vector< int >& a, const vector< int >& b) return a[0] < b[0];  );



int randBetween(int min, int max)

   return (rand()%(max-min))+min;


int main()

   vector<int> vecRow ;
   vector< vector<int> > vec2d;
   int rowSize = 3;

   for(int c = 0; c < 10; ++c)
   
      for(int r = 0; r < rowSize; ++r)
         vecRow.push_back( randBetween(0,255) );

      vec2d.push_back(vecRow);
      vecRow.clear();
   

   cout << "New 2d Vector Created: " << endl;
   printVec2d(vec2d);

   sort(vec2d.begin(), vec2d.end(), [](const vector< int >& a, const vector< int >& b) return a[1] < b[1];  );
   cout << "2d Vector Sorted on Col 1: " << endl;
   printVec2d(vec2d);

   vec2dSort( vec2d, 0);
   cout << "2d Vector Sorted on Col 0: " << endl;
   printVec2d(vec2d);

   return 0;

【问题讨论】:

你能显示一些输入和输出是什么(以及预期的输出是什么?)它是否运行?另外,对于它,你使用的是哪个 C++ 编译器? 代码块 10.02 rev 0 Linux 32 位 我可以让排序在两部分功能中工作。我在上面说明了这一点,因为我可以用代码格式化它。如果我尝试在 int 变量上创建 columnToSort,它会失败。它说没有匹配的调用函数 您的代码编译得很好,就像在 VS2013 中一样。您能否发布您收到的确切错误消息? 【参考方案1】:

在 lambda 中使用捕获来接受要排序的列号。

int columnToSort = 2;
sort(vec2d.begin(), vec2d.end(), [columnToSort](const vector< int >& a, const vector< int >& b)

    return a[columnToSort] < b[columnToSort];
);

【讨论】:

感谢您抽出宝贵时间回复。我按照您的建议尝试并得到以下错误:没有匹配函数调用 'sort(std::vector >::iterator, std::vector >::iterator, main()::&,...等。 .

以上是关于C++ 使用类对列上的 2d 向量进行排序失败(带比较功能的问题)的主要内容,如果未能解决你的问题,请参考以下文章

特定列上的 Jquery Handsontable 排序

SQL - 在列上排序数据而不将其包含在排名中

多次对向量进行排序

C++ 调试断言失败。向量下标超出范围

按多列对 2D 向量进行排序

对列值进行排序以匹配另一个表列中值的顺序