对于c++范围库的简单理解

原文传送门: https://blog.csdn.net/yuejisuo1948/article/details/122149361

看了原文之后,第一时间对于std::ranges的第一印象是觉得更麻烦了,原本我们只需要掌握一个std::vector容器的使用方法,但使用范围库时,我们需要学会每种视图功能,直接就增加了学习负担。

但仔细一想,这其实是一种针对循环体内各种条件处理的简化手段,甚至能将各种条件视图封装成库以达成可复用的目的。

 

请看下面的代码:

以下代码在vs2022 17.1 中可进行编译, 项目-属性-C++语言标准 需要修改为: /std:c++latest

#include <iostream>
#include <ranges>
#include <math.h>
namespace stdrv = std::ranges::views;

namespace mathrv {
    //偶数
    constexpr auto even = stdrv::filter([](int i) { return i % 2 == 0; });

    //奇数
    constexpr auto odd = stdrv::filter([](int i) { return i % 2 != 0; });

    //结果n次幂
    auto pow(int n) {
        return stdrv::transform([n](int i) {return (int)::pow(i, n); });
    }
}

int main()
{
    std::vector<int> v1 = { 9,8,7,6,5,4,3,2,1 };

    auto v = v1 | 
        mathrv::even | // 偶数
        mathrv::pow(2) | // 结果2次幂
        stdrv::reverse; // 倒序

    for (auto n : v) 
        std::cout << n << std::endl;
    
    return 0;
}

 

posted @ 2022-06-10 18:55  babypapa  阅读(87)  评论(0编辑  收藏  举报