C++20中views的学习与实战练习

张开发
2026/4/19 0:01:16 15 分钟阅读

分享文章

C++20中views的学习与实战练习
我们先来看实例有 n 座山排成一列每座山都有一个高度。给你一个整数数组 height 其中 height[i] 表示第 i 座山的高度再给你一个整数 threshold 。对于下标不为 0 的一座山如果它左侧相邻的山的高度严格大于threshold 那么我们称它是稳定的。我们定义下标为 0 的山不是稳定的。请你返回一个数组包含所有稳定山的下标你可以以任意顺序返回下标数组。经过对题意的分析可以分析出三个关键要点。(1) 首先要处理的数据范围不包含 0是 [1, n)。(2) 然后针对每个位置的判断是否符合题意对稳定的要求。(3) 最后将满足判断的下标合并到一个数组中作为答案。现在通过 range 和 view 可以分别针对这三个要点轻松处理。#include ranges ​ class Solution { public: std::vectorint stableMountains(vectorint height, int threshold) { // 1. 处理范围 [1, n) return views::iota(1, ssize(height)) // 2. 判断左侧相邻山的高度严格大于 threshold | views::filter([](int i) { return height[i - 1] threshold; }) // 3. 合并为 vectorint 返回答案 | ranges::tovectorint(); } };最后注意这里的 ranges::to 是 C23 中引入的函数。没错力扣已经开始支持 C23 标准了总结range 是 C20 的四大特性中最常用和最贴近每个程序员的一个特性。通过上面的学习想必大家应该可以感受到 view 的简洁和高效。从使用层面来讲我们只需要付出很少的学习代价就能了解和快速运用 view 来编写代码。且现在的主流编译器和在线平台对该特性的支持非常完善比如力扣甚至支持到 C23 标准一样。因此对于 range 我们更应该学起来用起来

更多文章