Streams 库有一个简洁的map
功能,可以通过成员函数查看范围。Range-V3中是否有任何等效视图?
会view::transform
是唯一的选择吗?
文章中的例子:
std::vector widgets = /* ... */
std::set ids = stream::MakeStream::from(widgets)
.map(&Widget::getId)
.to_set();
std::vector
(忽略和缺少的模板参数std::set
)在 range-v3 中将是:
std::vector<Widget> widgets = // ...
std::set<Widget::ID> ids = widgets | ranges::view::transform(&Widget::getId);
是transform
的,相当于map
in Streams。
range-v3 中的所有算法都接受Invokable Projections,允许算法根据转换选择范围元素,但仍对整个元素进行操作。例如,我们可以Widget
按它们的 ID 对 s 进行排序:
widgets |= ranges::action::sort(std::greater<Widget::ID>{}, &Widget::getId);