0

我想定义一个比较函数,以便它可以传递给 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>);
4

2 回答 2

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;
}
于 2013-06-28T09:49:04.643 回答
1

您根本无法做到这一点——模板仅用于类型和一些编译时常量。

您需要查看 的文档std::sort,其中解释了第三个参数应该使用什么样的比较函数。即使模板奇迹般地编译,你的也不会工作。

幸运的是,您的问题的解决方案已经发布在 Stack Overflow 上

于 2013-06-28T09:40:20.993 回答