gpt4 book ai didi

c++ - C++11 中的高阶函数

转载 作者:可可西里 更新时间:2023-11-01 15:39:30 31 4
gpt4 key购买 nike

我正在尝试使用 C++11 中可用的新匿名函数编写通用折叠函数,这是我所拥有的:

template<typename T>
T foldl(std::function<T(T,T)> f, T initial, std::vector<T> items) {
T accum = initial;
for(typename std::vector<T>::iterator it = items.begin(); it != items.end(); ++it) {
accum = f(accum, (*it));
}
return accum;
}

下面尝试使用它:

std::vector<int> arr;
arr.assign(8, 2);
foldl([] (int x, int y) -> int { return x * y; }, 1, arr);

导致错误:

main.cpp:44:61: error: no matching function for call to 'foldl(main(int, char**)::<lambda(int, int)>, int, std::vector<int>&)'
main.cpp:44:61: note: candidate is:
main.cpp:20:3: note: template<class T> T foldl(std::function<T(T, T)>, T, std::vector<T>)
main.cpp:20:3: note: template argument deduction/substitution failed:
main.cpp:44:61: note: 'main(int, char**)::<lambda(int, int)>' is not derived from 'std::function<T(T, T)>'

在我看来,使用 std::function 并不是定义 f 类型的正确方法。我该如何纠正这个问题?

最佳答案

您的代码不是很通用。不需要 functionvector 或任何类似的东西。通常,在 C++ 中,函数会放在参数列表的末尾(对于 lambda 尤其重要,因为它们可能很大)。

所以这样写会更好(即:更标准):

template<typename Range, typename Accum>
typename Range::value_type foldl(const Range &items, const typename Range::value_type &initial, Accum f)
{
typename Range::value_type accum = initial;
for(const auto &val : items) {
accum = f(accum, val);
}

return accum;
}

或者你可以 use std::accumulate它做完全相同的事情

关于c++ - C++11 中的高阶函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15458483/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com