c++ - 如何声明对标准算法的引用?

标签 c++ pointers reference

我正在尝试添加对标准算法的引用。如何编辑我的代码以使其正常工作?

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 您需要将它们传递给迭代器:

此外,为了应对函数的不同潜在重载,我们应该它们转换为我们需要的类型(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());
}

另请注意,我取消引用 me() 的返回值,因为它是一个迭代器(类似于指针)。

当然,如果您的 vector 为空,这将取消对无效位置的引用,因此我建议进行检查:

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());
}

关于c++ - 如何声明对标准算法的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49587703/

相关文章:

c++ - 包含 <omp.h> 的错误 (c++)

"super"关键字的 c++ 仿真

c++ - 隐藏c plus plus程序中的bash代码

c++ - 为什么指向数组表达式的指针起作用

C++ Protobufs::如何使用 MergeFrom() 删除特定字段?

macos - Swift 中来自 CGImage 的 RGB 数据

c++ - 删除已删除的对象 : behavior?

C++ 函数返回/输入引用类型

object - UML 中的引用对象和值对象有什么区别?

c++ - 将引用作为函数参数传递不起作用