【问题标题】:How can I compare/sort elements of a list container containing a custom typedef?如何比较/排序包含自定义 typedef 的列表容器的元素?
【发布时间】:2023-04-10 18:26:01
【问题描述】:

我想使用std::list STL 容器来对包含的项目应用订单。但是,我要使用的项目是自定义typedef,由自定义类型和代表权重的double 组成。如何确保可以根据元素的权重对结果列表进行排序?

typedef std::pair<linearVariable*, double> weightedVariable;

[...]

std::list<weightedVariable> tmp;

我必须做些什么来确保列表根据对的第二部分(重量)进行排序?有没有更好的方法来维护自定义类型的顺序?在我的情况下,重量不是linearVariable 的属性,但可以计算出来。

【问题讨论】:

  • "有没有更好的方法来维护自定义类型的顺序?"如果通过“维护订单”,您的意思是您要向容器中添加新元素,然后在每个元素之后再次对其进行排序,那么是的,有一个更好的方法:std::set。如果你只排序一次,那么vectordeque 可能会比list 更好,除非你做了很多从中间移除的操作。如果您只排序一次 并且 进行大量从中间移除,那么它可能在 listset 之间接近。

标签: c++ list stl compare containers


【解决方案1】:

您可以将std::list::sort 与自定义比较功能一起使用:

inline bool comp(const weightedVariable& lhs, const weightedVariable& rhs)
{
  return lhs.second < rhs.second;
}

tmp.sort(comp);

另一种选择是提供bool operator&lt; 并使用std::list::sort()

inline bool operator < (const weightedVariable& lhs, const weightedVariable& rhs)
{
  return lhs.second < rhs.second;
}

tmp.sort();

【讨论】:

  • 您也可以覆盖 运算符。可能值得一提,因为在某些情况下,这可能会使其他事情变得更合乎逻辑。
【解决方案2】:

由于C++11,您也可以使用lambda expression,而不是定义比较函数或运算符:

#include <list>
#include <iostream>
using namespace std;

int main()
{
    typedef void linearVariable;  // Dummy to make the code compile.
    typedef pair<linearVariable*, double> weightedVariable;
    list<weightedVariable> tmp;

    tmp.emplace_back(make_pair(nullptr, 0.4));
    tmp.emplace_back(make_pair(nullptr, 0.8));
    tmp.emplace_back(make_pair(nullptr, 0.2));

    tmp.sort([](const weightedVariable& a, const weightedVariable& b) {
        return a.second < b.second;
    });

    for (auto const &wv : tmp)
        cout << wv.second << endl;

    return 0;
}

输出:

0.2
0.4
0.8

Code on Ideone

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 2020-07-11
    • 2020-07-09
    • 2021-03-23
    • 2014-03-01
    相关资源
    最近更新 更多