您的位置:首页 > 编程语言 > C语言/C++

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

2017-09-15 18:37 513 查看
最近看了一篇博文: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的满足勾股定理的三角形的三条边长度。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  clang gcc c++ python