カスタムオブジェクトのベクトルを並べ替えるにはどうすればいいですか? 質問する

カスタムオブジェクトのベクトルを並べ替えるにはどうすればいいですか? 質問する

std::vectorカスタム (つまりユーザー定義) オブジェクトを含むオブジェクトを並べ替えるにはどうすればよいでしょうか?

std::sortおそらく、カスタム オブジェクト内のデータ メンバーの 1 つ (ソートのキーとして) を操作する述語 (関数または関数オブジェクト) とともに標準ライブラリ アルゴリズムを使用できます。

私は正しい道を歩んでいるだろうか?

ベストアンサー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<for を実装できます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());

編集2:> Kappa が示唆しているように、演算子をオーバーロードし、 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 を次のように呼び出す必要があります。

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

おすすめ記事