std::sort 和模板比较功能不起作用
std::sort and compare-function with template does not work
我想对一个任意类型的vector进行排序,所以写了如下代码:
#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
当我用具体类型实现比较函数时,它起作用了。
谁能告诉我如何使用模板比较函数做到这一点?
您需要指定您想要的专业:
sort(v.begin(), v.end(), compare<int>);
compare
不是一个函数,它是一个函数模板,可以用生成函数,比如compare<int>
和compare<long>
因此,要将函数传递给 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
时引用特定的特化,你传递 Compare
类型的临时变量,在 sort
算法内部,编译器将 select 函数模板的正确特化。
我想对一个任意类型的vector进行排序,所以写了如下代码:
#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
当我用具体类型实现比较函数时,它起作用了。 谁能告诉我如何使用模板比较函数做到这一点?
您需要指定您想要的专业:
sort(v.begin(), v.end(), compare<int>);
compare
不是一个函数,它是一个函数模板,可以用生成函数,比如compare<int>
和compare<long>
因此,要将函数传递给 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
时引用特定的特化,你传递 Compare
类型的临时变量,在 sort
算法内部,编译器将 select 函数模板的正确特化。