gpt4 book ai didi

c++ - 为什么 boost::adaptors::filtered 的输出没有名为 size 的成员?

转载 作者:行者123 更新时间:2023-12-03 11:15:03 26 4
gpt4 key购买 nike

以下虚拟程序编译并运行

#include <boost/range/adaptor/filtered.hpp>
#include <boost/range/adaptor/transformed.hpp>
#include <functional>
#include <utility>
#include <vector>

using boost::adaptors::filtered;
using boost::adaptors::transformed;
auto whatever = [](auto&& x){ return std::forward<decltype(x)>(x); };
auto whenever = [](auto&){ return true; };

int main() {
std::vector<int> v{1,2,3};
auto w1 = v | transformed(whatever);
auto w2 = v | transformed(whatever) | filtered(whenever);
w1.size();
//w2.size();
}
取消注释注释行并尝试使用 g++ -std=c++14 that_file.cpp 进行编译会导致此错误:
uffa.cpp: In function ‘int main()’:
uffa.cpp:17:8: error: ‘struct
boost::range_detail::filtered_range<<lambda(auto:2&)>, const
boost::range_detail::transformed_range<<lambda(auto:1&&)>, std::vector<int> >
>’ has no member named ‘size’
17 | w2.size();
| ^~~~
由于 filtered 就像 transformed 一样,需要一个范围并返回一个范围,我不明白为什么 sizefiltered 的输出中不可用。
我知道 transformedfiltered 是两个不同的数学函数(例如,前者假设它的输入是一个仿函数,而后者假设,如果我错了,请纠正我,它的输入是一个单子(monad)),但仍然......在这里输入是 std::vector 那么询问 size 输出的 filtered 有什么问题?

最佳答案

转换范围时,大小不会改变。这意味着 transform可以知道大小将是多少,因为它与输入相同。
过滤范围时,您可能会或可能不会从范围中删除元素。这是懒惰地完成的,所以在您通过过滤范围之前,您无法知道它将有多大。如果你做一个非惰性过滤器,你可以知道,但范围应该是惰性的。

关于c++ - 为什么 boost::adaptors::filtered 的输出没有名为 size 的成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65617373/

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