为什么 boost::adaptors::filtered 的输出没有名为 size 的成员?
Why output of boost::adaptors::filtered has no member named size?
以下虚拟程序编译并运行
#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
一样,需要一个范围,returns一个范围,我不明白为什么size
在[=14上不可用=]的输出。
我知道 transformed
和 filtered
是两个不同的数学函数(例如前者假设它的输入是一个函子,而后者假设,如果我错了请纠正我,那它的输入是一个 monad),但仍然......这里的输入是一个 std::vector
所以询问 filtered
输出的 size
有什么问题?
当您变换范围时,大小不会改变。这意味着 transform
可以知道大小是多少,因为它与输入相同。
过滤范围时,您可能会也可能不会从该范围中删除元素。这是懒惰地完成的,所以在你通过过滤范围之前你无法知道它会有多大。如果你做一个非惰性过滤器你可以知道,但是范围应该是惰性的。
您可以使用 boost::size
:
boost::size(w2)
但在性能方面可能代价高昂。
以下虚拟程序编译并运行
#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
一样,需要一个范围,returns一个范围,我不明白为什么size
在[=14上不可用=]的输出。
我知道 transformed
和 filtered
是两个不同的数学函数(例如前者假设它的输入是一个函子,而后者假设,如果我错了请纠正我,那它的输入是一个 monad),但仍然......这里的输入是一个 std::vector
所以询问 filtered
输出的 size
有什么问题?
当您变换范围时,大小不会改变。这意味着 transform
可以知道大小是多少,因为它与输入相同。
过滤范围时,您可能会也可能不会从该范围中删除元素。这是懒惰地完成的,所以在你通过过滤范围之前你无法知道它会有多大。如果你做一个非惰性过滤器你可以知道,但是范围应该是惰性的。
您可以使用 boost::size
:
boost::size(w2)
但在性能方面可能代价高昂。