在STL或boost中是否有C++等效的python Xrange生成器?
xrange基本上生成递增的数字,每次调用++运算符.构造函数是这样的:
xrange(first, last, increment)
Run Code Online (Sandbox Code Playgroud)
我希望通过每个使用boost来做这样的事情:
foreach(int i, xrange(N))
Run Code Online (Sandbox Code Playgroud)
我知道for循环.在我看来,他们是太多的样板.
谢谢
我想要这样做的主要原因是因为我使用语音文本软件,并且编程循环通常很难,即使使用代码完成.具有可显示的构造更有效.
许多循环从零开始并递增1,这是范围的默认值.我发现python构造更直观
for(int i = 0; i < N; ++i)
foreach(int i, range(N))
Run Code Online (Sandbox Code Playgroud)
需要将范围作为参数的函数:
Function(int start, int and, int inc);
function(xrange r);
Run Code Online (Sandbox Code Playgroud)
我理解语言之间的差异,但是如果python中的特定构造对我非常有用并且可以在C++中高效实现,我没有理由不使用它.对于每个构造,C++都是外来的,但是人们使用它.
我将我的实现放在页面底部以及示例用法.
在我的域中我使用多维数组,通常排名4张量.所以我经常会得到4个具有不同范围/增量的嵌套循环来计算规范化,索引等等.这些不一定是性能循环,我更关心正确性可读性和修改能力.
例如
int function(int ifirst, int ilast, int jfirst, int jlast, ...);
versus
int function(range irange, range jrange, ...);
Run Code Online (Sandbox Code Playgroud)
在上面,如果需要不同的strid,你必须传递更多的变量,修改循环等,最终你会得到大量的整数/几乎相同的循环.
foreach和range完全解决了我的问题.对普通C++程序员的熟悉程度并不高我的关注列表 - 问题领域是一个相当模糊,有很多元编程,SSE内在,生成代码.
我正在尝试编译以下代码:
#include <iostream>
#include <iterator>
#include <vector>
#include <boost/assign/std/vector.hpp>
#include <boost/optional.hpp>
#include <boost/range/adaptor/indirected.hpp>
#include <boost/range/algorithm/copy.hpp>
int main( int argc, char ** argv )
{
using namespace boost::assign;
using boost::adaptors::indirected;
std::vector<boost::optional<unsigned> > values;
values += 1u,2u,3u;
boost::copy( values | indirected, std::ostream_iterator<unsigned>( std::cout, " " ) );
std::cout << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
但是,我得到了一些错误,例如没有命名的类型element_type在boost::optional<unsigned>.该参考页页,但是,说,单前提条件是存在operator*()一元函数.有没有办法让它发挥作用?
我有一个vector<MyType>并希望另一个vector<MyType>只包含满足一些简单标准的MyTypes,例如某些数据成员等于某些东西.解决这个问题的最佳方法是什么?
在boost::adaptors::filteredfilter函数中的用法如下:
std::vector<int> input;
input += 1,2,3,4,5,6,7,8,9;
boost::copy(
input | filtered(is_even()),
std::ostream_iterator<int>(std::cout, ","));
Run Code Online (Sandbox Code Playgroud)
在这种情况下,管道操作员会产生什么影响?它没有为定义std::vector,它是过载吗?如果是这样,一个人如何有效地寻找诸如boost之类的自由经营者?