在模板参数中传递矢量

Passing vector in template argument

本文关键字:参数      更新时间:2023-10-16

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

不能将对象引用传递给模板或函数。但是你可以把它们传给structs。

以下是工作示例:

#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;
}

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

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

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