让C++写起来和Python一样简单的库range-v3

来源:互联网 发布:linux修改文件夹命令 编辑:程序博客网 时间:2024/06/07 01:45

最近看了一篇博文:C++ 17 写法上已经很接近 python 了。这里引出了一个很骚的库:range-v3。这个库可以让C++更加容易实现filter/mapreduce/sort/iterator等函数。
range-v3需要clang 3.6.2 及以上和GCC 4.9.1及以上的编译器版本支持,毕竟里面好多代码是以C++11/14/17为基础写的。
源码地址:https://github.com/ericniebler/range-v3。
一.安装:
在win和linux系统下都可以

git clone https://github.com/ericniebler/range-v3.git

然后把range-v3-0.3.0\include下的所有文件复制到你的GCC/Clang目录的include目录下,然后就可以使用了:

#include <chrono>#include <iostream>#include <range/v3/all.hpp>using namespace ranges;int main(){ auto triples =        view::for_each(view::ints(1), [](int z)        {            return view::for_each(view::ints(1, z+1), [=](int x)            {                return view::for_each(view::ints(x, z+1), [=](int y)                {                    return yield_if(x*x + y*y == z*z, std::make_tuple(x, y, z));                });            });        });    //// This alternate syntax also works:    //auto triples = ints(1)      >>= [] (int z) { return    //               ints(1, z+1) >>= [=](int x) { return    //               ints(x, z+1) >>= [=](int y) { return    //    yield_if(x*x + y*y == z*z,    //        std::make_tuple(x, y, z)); };}; };    // Display the first 100 triples    RANGES_FOR(auto triple, triples | view::take(100))    {        std::cout << '('            << std::get<0>(triple) << ','            << std::get<1>(triple) << ','            << std::get<2>(triple) << ')' << '\n';    }}class timer{private:    std::chrono::high_resolution_clock::time_point start_;public:    timer()    {        reset();    }    void reset()    {        start_ = std::chrono::high_resolution_clock::now();    }    std::chrono::milliseconds elapsed() const    {        return std::chrono::duration_cast<std::chrono::milliseconds>(            std::chrono::high_resolution_clock::now() - start_);    }    friend std::ostream &operator<<(std::ostream &sout, timer const &t)    {        return sout << t.elapsed().count() << "ms";    }};void benchmark(){    // Define an infinite range containing all the Pythagorean triples:    auto triples =        view::for_each(view::ints(1), [](int z)        {            return view::for_each(view::ints(1, z+1), [=](int x)            {                return view::for_each(view::ints(x, z+1), [=](int y)                {                    return yield_if(x*x + y*y == z*z, std::make_tuple(x, y, z));                });            });        });    static constexpr int max_triples = 3000;    timer t;    int result = 0;    RANGES_FOR(auto triple, triples | view::take(max_triples))    {        int i, j, k;        std::tie(i, j, k) = triple;        result += (i + j + k);    }    std::cout << t << '\n';    std::cout << result << '\n';    result = 0;    int found = 0;    t.reset();    for(int z = 1;; ++z)    {        for(int x = 1; x <= z; ++x)        {            for(int y = x; y <= z; ++y)            {                if(x*x + y*y == z*z)                {                    result += (x + y + z);                    ++found;                    if(found == max_triples)                        goto done;                }            }        }    }done:    std::cout << t << '\n';    std::cout << result << '\n';}

以上代码会打印出单边小于200的满足勾股定理的三角形的三条边长度。

阅读全文
0 0
原创粉丝点击