首页 > 解决方案 > 带有比较器的模板向量中的 min_element。编译错误

问题描述

我有一个模板向量std::vector<T> beginStore;,我想在该向量中找到最小值。所以,首先我像这样实现它:

template<typename T, typename Comp = DefaultComp>
//some code
T min = beginStore.at(0);
size_t ind = 0;
for (int i = 1; i < beginStore.size(); ++i) {
    if (Comp::compare(*beginStore.at(i), *min)) {
        min = beginStore.at(i);
        ind = i;
    }
}

我的比较器在哪里:

struct DefaultComp {
    template<typename T>
     static bool compare(T a, T b) {
        return a < b;
    }
};

然后我想使用 C++17 的所有功能并使用 std::min_element 和 std::distance:

auto min = std::min_element(beginStore.begin(),beginStore.end(),Comp::compare);
auto ind = std::distance(beginStore.begin(),min);

然后它会出现这样的错误:

没有匹配函数调用'min_element' auto min = std::min_element(beginStore.begin(),beginStore.end(),Comp::compare);

我已经尝试std::greater、实施operator()、使用不同的比较器,如下所示:

struct myclass {
    template<typename T>
    bool operator() (T i,T j) { return i<j; }
} myobj;

但我无法获得成功。 UPD很抱歉让您感到困惑,但向量包含指针。重写 std::distance。真的,这不是我想要的。

标签: c++c++17

解决方案


DefaulComp::compare是模板,因此您不能以这种方式将其传递给std::min_element.

要么提供类型

std::min_element(beginStore.begin(), beginStore.end(), &Comp::compare<int>);

或将其包装在仿函数中:

std::min_element(beginStore.begin(),
                 beginStore.end(),
                 [](const auto& lhs, const auto& rhs){ return Comp::compare(lhs, rhs); });

推荐阅读