我想定义一个比较函数,以便它可以传递给std :: sort。比较需要基于向量x的排序来完成,如下面的'compare_by_x'函数所示。
template <std::vector<double> x>
bool compare_by_x(int i, int j){
return x[i] <= x[j];
}
我想传递compare_by_x函数,如下所示。这不起作用。
std::sort(some_index_vector.begin(), some_index_vector.end(), compare_by_x<x>);
答案 0 :(得分:4)
您无法将对象引用传递给模板或函数。 但是你可以将它们传递给结构体。
以下是工作示例:
#include <iostream>
#include <vector>
#include <algorithm>
struct compare_by_x
{
std::vector<double>& x;
compare_by_x(std::vector<double>& _x) : x(_x) {}
bool operator () (int i, int j)
{
return x[i] <= x[j];
}
};
int main(int argc, const char *argv[])
{
std::vector<double> some_index_vector;
some_index_vector.push_back(0);
some_index_vector.push_back(1);
some_index_vector.push_back(2);
std::vector<double> x;
x.push_back(3);
x.push_back(1);
x.push_back(2);
std::sort(some_index_vector.begin(), some_index_vector.end(), compare_by_x(x));
for (std::vector<double>::const_iterator it = some_index_vector.begin(); it != some_index_vector.end(); ++it)
{
std::cout << *it << ' ';
}
std::cout << std::endl;
return 0;
}
答案 1 :(得分:1)
你根本做不到 - 模板只适用于类型和一些编译时常量。
你需要看一下documentation of std::sort
,它解释了期望什么样的比较函数作为第三个参数。即使模板 奇迹般地编译,你的也无法工作。
幸运的是,问题的解决方案has already been posted on Stack Overflow。