priority_queue & agent2d code

记录下优先队列的使用

源代码

  • action_chain_graph.cpp
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    class ChainComparator
    {
    public:
    bool operator()( const std::pair< std::vector< ActionStatePair >,
    double > & a,
    const std::pair< std::vector< ActionStatePair >,
    double > & b )
    {
    return ( a.second < b.second );
    }
    };


    std::priority_queue

    <std::pair < std::vector< ActionStatePair >, double >,
    std::vector < std::pair< std::vector< ActionStatePair >, double > >,
    ChainComparator >
    queue;

优先队列

  • #include
  • 基本操作

    • empty() 如果队列为空返回真
    • pop() 删除对列首元素
    • push() 加入一个元素
    • size() 返回优先队列中拥有的元素个数
    • top() 返回优先队列首元素
      在默认的优先队列中,优先级高的先出队。如果是数值,就大的先出队列.
      标准库默认使用元素类型的 < 操作符来确定它们之间的优先级关系.
      如果需要优先级低的先出队,则需要自定义优先级
  • 初始化

  • 重载()运算符来定义优先级
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//简单的重载函数
class cmp
{
bool operator () (const int &a, const int &b)
{
//由小到大排列采用">"号,如果要由大到小排列,则采用"<"号;
return a > b;
}
};

//代码中的重载函数
class ChainComparator
{
public:
bool operator()( const std::pair< std::vector< ActionStatePair >,
double > & a,
const std::pair< std::vector< ActionStatePair >,
double > & b )
{
return ( a.second < b.second );
}
};

结论

代码中使用了优先队列,并且重载了(),使队列中大值优先
如果是默认的优先对列,就是大值优先,但是作者这么写,估计是为了用后面double eval来排序八