5 View
通常若引用范围的元素修改,则视图的元素也会修改。
若视图的元素修改,则引用范围的元素也会修改。
视图通常用于在特定的基础上,处理基础范围的元素子集和/或经过一些可选转换后的值。例 如,可以使用一个视图来迭代一个范围的前五个元素
for (const auto& elem : std::views::take(coll, 5)) { ... }
-
管道语法中让视图对范围进行操作。通过使用操作符 |,可以创建视图的管道:
auto v = coll | std::views::filter([](auto elem){return elem % 3 == 0;}) | std::views::transform([](auto elem){return elem * elem;}) |std::views::take(3);
-
通过类模板指定范围结束的值
template<auto End> struct EndValue { bool operator== (auto pos) const { return *pos == End; // end is where iterator points to End } }; int main() { std::vector coll = {42, 8, 0, 15, 7, -1}; std::ranges::subrange range{coll.begin(), EndValue<7>{}}; std::ranges::sort(range); std::ranges::for_each(coll.begin(), EndValue<-1>{}, [](auto value){std::cout << ' ' << value;}) }
-
支持投影功能,避免写显示的比较器,直接通过投影的方式指定使用Person的age进行排序
struct Person { std::string name; int age; }; std::vector<Person> people = {{"Alice", 25}, {"Bob", 30}, {"Charlie", 20}}; std::sort(people.begin(), people.end(), [](const Person& a, const Person& b) { return a.age < b.age; }); std::ranges::sort(people, std::less<int>{}, &Person::age);