对自定义对象的向量进行排序

新手上路,请多包涵

如何对包含自定义(即用户定义)对象的向量进行排序。

可能应该使用标准 STL 算法 排序 以及将在自定义对象中的一个字段(作为排序键)上操作的谓词(函数或函数对象)。

我在正确的轨道上吗?

原文由 TL36 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 340
2 个回答

使用 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 建议的那样,您还可以通过重载 > 运算符并稍微更改排序调用来按降序对向量进行排序:

 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>());

原文由 Alan 发布,翻译遵循 CC BY-SA 3.0 许可协议

在 C++20 中,可以默认 operator<=> 没有用户定义的比较器。编译器会处理这个问题。

 #include <iostream>
#include <compare>
#include <vector>
#include <algorithm>

struct MyInt
{
    int value;
    MyInt(int val) : value(val) {}
    auto operator<=>(const MyInt& other) const = default;
};

int main()
{
    MyInt Five(5);
    MyInt Two(2);
    MyInt Six(6);

    std::vector V{Five, Two, Six};
    std::sort(V.begin(), V.end());

    for (const auto& element : V)
        std::cout << element.value << std::endl;
}

输出:

 2
5
6

原文由 Tony Tannous 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题