如何声明对STD算法的引用

How to declare a reference to std algorithm?

本文关键字:STD 算法 引用 何声明 声明      更新时间:2023-10-16

我正在尝试将引用添加到STD算法中。如何编辑代码以使其正常工作?

double f(const std::vector<double> &arr, bool maxElem)
{
    auto me = maxElem ? std::max_element : std::min_element;
    //...
    x = me(arr.begin(), arr.end());
    //...
}

您的功能是模板函数,因此您必须指定模板参数。在这种情况下,使用std::vector,您需要通过它们迭代器

此外,要应对功能的不同电位过载,我们应该 cast 它们到我们需要的类型(thnx to @christianhackl(>:

double f(const std::vector<double>& arr, bool maxElem)
{
    // deduce the iterator parameter types
    using Iterator = decltype(arr.begin());
    // select the overload type
    using Overload = Iterator(*)(Iterator, Iterator);
    auto me = maxElem
        ? static_cast<Overload>(std::max_element<Iterator>)
        : static_cast<Overload>(std::min_element<Iterator>);
    // need to dereference this because `me` returns an iterator
    return *me(arr.begin(), arr.end());
}

还请注意i dereference me()的返回值,因为它是迭代器(如指针(。

当然,如果您的矢量为空,可以放置一个无效的位置,因此我建议放置检查:

double f(const std::vector<double>& arr, bool maxElem)
{
    // Avoid Undefined Behavior
    if(arr.empty())
        throw std::runtime_error("empty vector not allowed");
    // deduce the parameter types
    using Iterator = decltype(arr.begin());
    // select the overload type
    using Overload = Iterator(*)(Iterator, Iterator);
    auto me = maxElem
        ? static_cast<Overload>(std::max_element<Iterator>)
        : static_cast<Overload>(std::min_element<Iterator>);
    // need to dereference this because `me` returns an iterator
    return *me(arr.begin(), arr.end());
}

这样:

if (maxElem)
   return std::max_element(arr.begin(), arr.end());
else
   return std::min_element(arr.begin(), arr.end());

you 可以可能会引用您要使用的每种"算法"模板专业化的参考,但是由于需要指定模板参数,它将是混乱而冗长的,因此虚假经济。它也可能会受到绩效罚款(破坏非线值(。

首先,f这样的行为确实没有意义。尝试使您的功能做得很好。可以说,他们的基本语义不应取决于这样的论点。