我正在尝试添加对标准算法的引用。如何编辑我的代码以使其正常工作?
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/