3

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

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

[...]

std::list<weightedVariable> tmp;

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

4

2 回答 2

8

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

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

tmp.sort(comp);

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

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

tmp.sort();
于 2012-12-03T10:00:30.217 回答
0

C++11开始,您还可以使用lambda 表达式而不是定义比较函数或运算符:

#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

Ideone 上的代码

于 2018-07-06T08:49:41.433 回答