0

次のブースト アルゴリズムを使用して、2D ベクトルを並べ替えています。

#include <vector>
#include <boost/algorithm/string.hpp>

using namespace std;


class StringListCompare
{
public:
  explicit StringListCompare(int column) : m_column(column) {}
  bool operator()(const vector<string>& lhs, const vector<string>& rhs)
  {
    // what do we do if lhs or rhs don't have (m_column + 1) elements?
    return lhs[m_column] < rhs[m_column];
  }
private:
  int m_column;
};

int main()
{
  std::vector <std::vector <std::string> > data;
  std::vector <std::string> temp;
  //
  // Load 2D vector 
  sort(data.begin(), data.end(), StringListCompare(2));

  //Print 2D vector after sorting by 2nd column
}

ここでは、引数として指定した 1 つの列のみでベクトルを並べ替えることができます。しかし、このベクトルを 2 列で並べ替えたいと思います。私の最初の列はソートされているはずです。最初の列の並べ替えに従って、2 番目の列でベクトルを再度並べ替えたいと思います。これどうやってするの ?

最初の列で最初に並べ替えてから、最初の列が等しいものを並べ替えて、2 番目の列で並べ替えたいですか?

4

3 に答える 3

1

あなたが望むものを手に入れたら、辞書順(およびstd::lexigraphical_compare述語)が役立ちます。

于 2013-01-30T13:56:19.200 に答える
0

数で試してみました。しかし、これはタイプの不一致エラーであることを私は知っています。

class StringListCompare
{

public:
  explicit StringListCompare(int column, int column2, string fCol, string sCol) : m_column(column), m_column2(column2) , fColType(fCol), sColType(sCol) {}

  bool operator()(const vector<string>& lhs, const vector<string>& rhs)
  {

        if (lhs[m_column] == rhs[m_column])
        {
             if (fColType.compare("string")==0)
                return lhs[m_column2] < rhs[m_column2];
            else  if (fColType.compare("number")==0)
                return atoi(lhs[m_column2]) < atoi(rhs[m_column2]);
        }

        else
        {
             if (fColType.compare("string")==0)
                return lhs[m_column] < rhs[m_column];
            else  if (fColType.compare("number")==0)
                return atoi(lhs[m_column]) < atoi(rhs[m_column]);
        }

  }
private:
  int m_column;
  int m_column2;
  string fColType;
  string sColType;
};

さまざまなデータ型の並べ替えでこのように実行できるロジックはありますか?

于 2013-02-01T13:36:07.257 に答える
0

あなたがしたいのは、 @distantTransformer がlexicographical_compareと言うようです。StringListCompareこれは、文字列のリスト全体を処理することを除いて、作成した とほとんど同じように動作します。最も一般的な使用例のように、文字ではなく文字列のリストを並べ替えますが、イテレータで動作するため、 lexicographical_compareでは問題ありません。

学習経験として自分で比較を行い、StringListCompare を拡張したい場合は、次のように行うことができます。

bool operator()(const vector<string>& lhs, const vector<string>& rhs)
{
   for (int i = 0; i < lhs.size(); ++i) {         
     if (rhs.size() <= i) return false; //rhs has fewer strings than lhs
     if (lhs[i] < rhs[i]) return true;
     if (lhs[i] > rhs[i]) return false;
     //for loop continues while the two vectors are equal
   }
   return true; //rhs must be equal or a have more strings than lhs
}

イテレータを使用してこれを書き直すことを検討できますが、これは基本的な実装です。

于 2013-01-31T06:48:37.263 に答える