C++23 中的 views::stride:让范围操作更灵活

举报
码事漫谈 发表于 2025/05/12 18:13:25 2025/05/12
【摘要】 什么是 views::stride 语法与用法 参数与返回值 实现细节 适用场景 编译器支持 总结 什么是 views::strideviews::stride 是 C++23 引入的一个范围适配器。它允许我们从一个范围中以固定步长提取元素,从而生成一个新的范围视图。具体来说,给定一个范围和一个步长 n,views::stride 会生成一个新范围,其中包含原范围中每隔 n 个元素的一个元...

什么是 views::stride

views::stride 是 C++23 引入的一个范围适配器。它允许我们从一个范围中以固定步长提取元素,从而生成一个新的范围视图。具体来说,给定一个范围和一个步长 nviews::stride 会生成一个新范围,其中包含原范围中每隔 n 个元素的一个元素。

语法与用法

views::stride 的基本用法如下:

#include <ranges>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    auto strided_view = vec | std::views::stride(2);

    for (auto val : strided_view) {
        std::cout << val << " ";
    }
    // 输出:1 3 5 7 9
}

在上面的代码中,std::views::stride(2) 表示从 vec 中每隔一个元素提取一个元素,最终生成的新范围包含原范围中索引为 0、2、4、6、8 的元素。

参数与返回值

views::stride 的参数包括一个范围和一个步长。步长必须是一个正整数,否则行为是未定义的。返回值是一个范围视图,其大小取决于原范围的大小和步长。

实现细节

views::stride 的实现基于 C++23 的范围库。它通过定义一个 stride_view 类模板来实现。该类模板继承自 std::ranges::view_interface,并提供了必要的迭代器支持。

适用场景

views::stride 在处理大规模数据时非常有用。例如,在图像处理中,我们可能需要以特定的步长遍历像素数据。views::stride 可以轻松实现这一点,而无需手动编写复杂的循环逻辑。

编译器支持

截至2025年5月,views::stride 已经得到了部分编译器的支持。例如,GCC 的 libstdc++ 从版本 13 开始支持,而 MSVC STL 从版本 19.34 开始支持。

总结

views::stride 是 C++23 中一个非常有用的范围适配器。它让范围操作更加灵活,可以轻松实现以固定步长提取元素。如果你正在使用支持 C++23 的编译器,不妨尝试使用 views::stride 来简化你的代码。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。