带有模板的 std::sort 和 compare-function 不起作用

Posted

技术标签:

【中文标题】带有模板的 std::sort 和 compare-function 不起作用【英文标题】:std::sort and compare-function with template does not work 【发布时间】:2015-01-16 13:19:23 【问题描述】:

我想对任意类型的向量进行排序,所以写了如下代码:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

template<class T>
bool compare(T a, T b) 
    return a < b;


int main() 
    vector<int> v;
    v.push_back(3);
    v.push_back(4);
    v.push_back(2);
    v.push_back(1);

    sort(v.begin(), v.end(), compare);

    for (size_t i = 0; i < v.size(); i++) 
        cout << v.at(i) << " ";
    

    return 0;

此代码未编译,并显示如下错误消息:

..\src\Test.cpp:22:34: error: no matching function for call to 'sort(std::vector<int>::iterator, std::vector<int>::iterator, <unresolved overloaded function type>)'
..\src\Test.cpp:22:34: note: candidates are:

... and more

当我使用具体类型实现比较函数时,它可以工作。 谁能告诉我如何使用模板比较功能来做到这一点?

【问题讨论】:

【参考方案1】:

你需要指定你想要的专业:

sort(v.begin(), v.end(), compare<int>);

Live on Coliru

【讨论】:

【参考方案2】:

compare不是函数,是函数模板,可以生成函数,如compare&lt;int&gt;compare&lt;long&gt;

所以要将函数传递给sort,您需要命名函数模板的特化:

sort(v.begin(), v.end(), compare<int>);

或者,创建一个函数对象并传递它:

struct Compare 
  template<typename T>
    bool operator()(T a, Tb) const  return a < b; 
;
sort(v.begin(), v.end(), Compare());

这个函数对象有一个成员函数模板,可以比较任何类型(比如你的compare),但是你在传递给sort时不需要引用特定的特化,你传递一个临时类型的@ 987654329@ 和sort 算法内部,编译器将选择函数模板的正确特化。

【讨论】:

以上是关于带有模板的 std::sort 和 compare-function 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

sort中的比较函数compare

如何使用单独类的属性对向量进行 std::sort [关闭]

使用 std::sort 对包含两个数据成员的对象向量进行排序

C++STL标准算法库的学习笔记

混淆使用 std::less 和 std::greater 与 std::sort

C++算法从std::sort到排序算法