1

2 つの列に依存する 2D ベクトルの並べ替えのコードを作成しました。例えば、これが2D列のデータなら

バナナ バイク 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番目のプログラムで。

4

1 に答える 1

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;
}
于 2014-01-22T13:47:47.087 に答える