2014-01-22 71 views
1

我已經編寫了一個2D矢量上的排序取決於兩列。例如,如果這是二維數據列超過兩列排序在2D矢量C++

banana bike 2 |蘋果車1 |橙色週期5 |香蕉車2 |蘋果 自行車3

然後,我的排序將改變這一數據,

蘋果自行車3 |蘋果車1 |香蕉腳踏車2 |香蕉車2 |橙色 週期5

我在下面給出了我的編碼。

class StringListCompare 
{ 
public: 
    explicit StringListCompare(int column, int column2) : m_column(column), m_column2(column2) {} 

bool operator()(const vector<string>& lhs, const vector<string>& rhs) 
    { 
     if (lhs[m_column] == rhs[m_column]) 
     { 
      return lhs[m_column2] < rhs[m_column2]; 
     } 
     else 
     { 
      return lhs[m_column] > rhs[m_column]; 
     } 
    } 
private: 
    int m_column; 
    int m_column2; 
}; 

現在我想擴展這2列級別的排序無限的列級別排序。所以我改變了這個代碼,如下所示。但我不知道我在這裏錯過了什麼邏輯。

class CompareSort 
{ 
public: 
    explicit CompareSort(std::vector<int> fcol,string fsortTyp,string fcaseflg): colNums(fcol) , sortTyp(fsortTyp), caseflg(fcaseflg) {} 

bool operator()(const vector<string>& lhs, const vector<string>& rhs) 
    { 
     int ret; 
     size_t noCol=colNums.size(); 
     for(size_t i=0;i<noCol;i++) 
     { 
      string lhStr=lhs[colNums[i]]; 
      string rhStr=rhs[colNums[i]]; 
      if(caseflg=="n") 
      { 
       lowercase(lhStr); 
       lowercase(rhStr); 
      } 
      if(sortTyp=="asc") 
       ret= lhStr < rhStr; 
      else 
       ret= lhStr > rhStr;    
    } 
    return ret; 

    } 
private: 
    std::vector<int> colNums; 
    string sortTyp,caseflg; 
}; 

如何檢查此行

if (lhs[m_column] == rhs[m_column]) 

在我的第二個項目。

回答

2

下面是一些僞代碼,可以幫助你一下:

bool compare(lhs, rhs) { 
    //compare lhs and rhs, which you know is different at this point 
} 

bool operator()(lhs, rhs) { 
for i := 0 to noCol 
    if lhs[i] != rhs[i] 
     return compare(lhs, rhs) 

//We know now that lhs and rhs are equal 
return true; 
}