1. ホーム
  2. c++

[解決済み】カスタムオブジェクトのベクターをソートする

2022-03-30 18:26:39

質問

カスタム(ユーザー定義)オブジェクトを含むベクターをどのようにソートするのですか?

おそらく、標準的なSTLアルゴリズム ソート と共に、カスタムオブジェクトのフィールドの1つ(ソートのためのキーとして)を操作する述語(関数または関数オブジェクト)が使用されるべきです。

私は正しい道を歩んでいるのでしょうか?

どのように解決するのですか?

を使った簡単な例です。 std::sort

struct MyStruct
{
    int key;
    std::string stringValue;

    MyStruct(int k, const std::string& s) : key(k), stringValue(s) {}
};

struct less_than_key
{
    inline bool operator() (const MyStruct& struct1, const MyStruct& struct2)
    {
        return (struct1.key < struct2.key);
    }
};

std::vector < MyStruct > vec;

vec.push_back(MyStruct(4, "test"));
vec.push_back(MyStruct(3, "a"));
vec.push_back(MyStruct(2, "is"));
vec.push_back(MyStruct(1, "this"));

std::sort(vec.begin(), vec.end(), less_than_key());


編集する Kirill V. Lyadvinsky が指摘したように、ソート述語を指定する代わりに operator< に対して MyStruct :

struct MyStruct
{
    int key;
    std::string stringValue;

    MyStruct(int k, const std::string& s) : key(k), stringValue(s) {}

    bool operator < (const MyStruct& str) const
    {
        return (key < str.key);
    }
};

この方法を用いると、単純に以下のようにベクトルを並べ替えることができることになります。

std::sort(vec.begin(), vec.end());

Edit2: Kappaが提案するように、vectorを降順にソートすることもできます。 > 演算子で、sort の呼び出しを少し変更します。

struct MyStruct
{
    int key;
    std::string stringValue;

    MyStruct(int k, const std::string& s) : key(k), stringValue(s) {}

    bool operator > (const MyStruct& str) const
    {
        return (key > str.key);
    }
};

そして、sort as を呼び出す必要があります。

std::sort(vec.begin(), vec.end(),greater<MyStruct>());