C++ 在 priority_queue 中使用 std::greater() 并排序

标签 c++ c++11 object templates types

为什么这两种情况的文档说的是同一件事,但它们以相反的方式声明,一个使用greater<int>而另一个使用 greater<int>() .任何人都可以解释一下吗?

文档 priority_queue cpp library 说那个comp

can be Comparison object to be used to order the heap. This may be a function pointer or function object

priority_queue<int, vector<int>, greater<int>> minheap;  //works
priority_queue<int, vector<int>, greater<int>() > minheap; //why fail?

文档 cpp library sort说的是同一件事,即 comp 可以是函数指针,也可以是函数对象。

sort (numbers.begin(), numbers.end(), std::greater<int>()); //works
sort (numbers.begin(), numbers.end(), std::greater<int>); //fail

最佳答案

在这个声明中

priority_queue<int, vector<int>, greater<int>> minheap; 

greater<int>是指定类型的模板参数,对应于类型模板参数 class Compare优先队列的

template<class T, class Container = vector<T>,
class Compare = less<typename Container::value_type>>
class priority_queue;

在这个声明中

sort (numbers.begin(), numbers.end(), std::greater<int>());

使用默认构造函数创建类型为 greater<int> 的临时对象.

std::greater是模板结构

template<class T = void> struct greater;

那就是它的特化提供了一个类型。

您可以将模板特化用作声明中的类型说明符。例如

std::greater<int> obj1;
std::greater<double> obj2;
std::greater<std::string> obj3;

在第一种情况下,您必须为相应的类型模板参数指定类型参数。

在第二种情况下,您必须指定类型为 greater<int> 的对象.

考虑到如果您尝试使用记录 std::greater<int>()作为 priority_queue 的模板参数,那么编译器将其视为具有返回类型 std::greater<int> 的函数类型说明符并且没有参数。因为编译器期望类型说明符作为模板参数而不是表达式。但是将这样的函数类型指定为类型模板参数对于 priority_queue 没有意义。

为了更清楚地重写 std::sort 的调用,如下所示

std::greater<int> obj;
sort (numbers.begin(), numbers.end(), obj );

如您所见,这里是 std::greater<int>是变量 obj 的类型说明符它作为参数提供给函数 std::sort .上面调用和这个调用的区别

sort (numbers.begin(), numbers.end(), std::greater<int>());

是在最后一种情况下创建了一个 std::greater<int> 类型的临时对象喜欢std::greater<int>() .

这是一个演示程序

#include <iostream>
#include <functional>
#include <iterator>
#include <algorithm>

int main() 
{
    int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    for ( const auto &item : a ) std::cout << item << ' ';
    std::cout << '\n';

    std::greater<int> comp;

    //  Here is used an already created object of the type std::greater<int> 
    std::sort( std::begin( a ), std::end( a ), comp );

    for ( const auto &item : a ) std::cout << item << ' ';
    std::cout << '\n';

    //  Here is used a remporary object of the type std::less<int> 
    std::sort( std::begin( a ), std::end( a ), std::less<int>() );

    for ( const auto &item : a ) std::cout << item << ' ';
    std::cout << '\n';

    return 0;
}

程序输出为

0 1 2 3 4 5 6 7 8 9 
9 8 7 6 5 4 3 2 1 0 
0 1 2 3 4 5 6 7 8 9 

关于C++ 在 priority_queue 中使用 std::greater() 并排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56905128/

相关文章:

c++ - const 引用元组 : cannot convert from int to const <T> &

c++ - 无法删除控制台窗口中的退出代码

ubuntu - Ubuntu 14.04 VM : -std=c++11 flag isn't being detected 上的 GCC 4.8.4 错误

c++ - 是否可以通过#define 将 g++ 设置为遵循 C++11 ISO (-std=c++11)?

c++ - 无法分配一个指向模板化类的指针的成员

javascript - 带有数字键的对象无论如何都会发送所有以前的数字

javascript 对象元素错误

c++ - 如何在 IDL 中声明宽字符常量

c++ - 从带有原始指针的 vector 中删除 std::unique_ptr 的最佳方法?

c++ - 澄清想要重新。 C++ 类型特征