3

文字列のベクトルのベクトルを並べ替えようとしていますが、コンパレータ関数を作成する方法がわかりません。

私はこのスレッドを見ましたが、私の状況に実装できませんでした: C++での文字列のベクトルのベクトルの並べ替え

だから私は次のような文字列のベクトルのベクトルを持っています:
hello、world、
1、3、4、7、2、1 world、hello、1、4、8、4、2、1
電話、マウス、2、3 、5、2、1、4

このベクトル文字列のベクトルを、ユーザーが指定した列で並べ替える必要があります。私のユーザーは、ソートする複数の列を指定できます。列3と5を考えてみましょう。列3(1,1,2)は行1と2で同じ値であるため、列5で並べ替える必要があります。複雑にならないように、これはすべて昇順です。

コンパレータ関数に渡したときの仕組みの概念がわかりません。それらのスレッドの人々によって投稿された例の中で、私の関数はどのようにループされますか?

とにかくよろしくお願いします!

4

1 に答える 1

4

を使用std::sortしてベクトルを並べ替え、カスタムコンパレータファンクタ(つまり、オーバーロードされたクラスoperator())を定義できます。

並べ替え列のインデックスをstd::vector(カスタムコンパレータオブジェクトの「状態」の一部になります)に格納し、インデックスがそのベクトルに格納されている列の文字列を比較できます。

「列の並べ替え」ベクトルの最初のインデックスで指定された列から値の比較を開始します。それらが同じである場合は、ベクトルの次のインデックスなどで指定された列の値を比較し続けます。これはfor、コンパレータのoperator()オーバーロードの本体内のループ内で実行できます。

例として次のコードを参照してください(g ++(GCC)4.7.2でコンパイル):

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
using namespace std;

vector<vector<string>> BuildTestData()
{   
    vector<string> r1 = {"hello", "world", "1", "3", "4", "7", "2", "1"};
    vector<string> r2 = {"world", "hello", "1", "4", "8", "4", "2", "1"};
    vector<string> r3 = {"phone", "mouse", "2", "3", "5", "2", "1", "4"};

    return vector<vector<string>>{r1, r2, r3};
}

void PrintData(const vector<vector<string>> & v)
{
    for (size_t r = 0; r < v.size(); r++)
    {
        for (size_t c = 0; c < v[r].size(); c++)
            cout << v[r][c] << ' ';
        cout << '\n';
    }
}

class StringListComparator
{
public:
    explicit StringListComparator(vector<int> sortColumns)
        : m_sortColumns( move(sortColumns) )
    {
    }

    bool operator()(const vector<string>& lhs, const vector<string>& rhs) const
    {   
        // For each sorting column:
        for (size_t i = 0; i < m_sortColumns.size(); i++)
        {
            // Comparison with current column
            const int currentColumn = m_sortColumns[i];

            if (lhs[currentColumn] < rhs[currentColumn])
                return true;

            if (lhs[currentColumn] > rhs[currentColumn])
                return false;

            // lhs[currentColumn] == rhs[currentColumn],
            // so check with next sorting column
        }

        return false;
    }

private:
    vector<int> m_sortColumns;
};

int main()
{
    auto v = BuildTestData();
    cout << "Before sorting:\n";    
    PrintData(v);

    vector<int> sortColumns = {5, 7}; // indexes are 0-based

    sort(v.begin(), v.end(), StringListComparator(sortColumns));

    cout << "\nAfter sort:\n";
    PrintData(v);
}

サンプル実行:

Before sorting:
hello world 1 3 4 7 2 1
world hello 1 4 8 4 2 1
phone mouse 2 3 5 2 1 4

After sort:
phone mouse 2 3 5 2 1 4
world hello 1 4 8 4 2 1
hello world 1 3 4 7 2 1
于 2013-03-03T15:35:39.570 に答える