PYTHON的Range类非常好用,所以用C++来简单实现下: 

 // 实现Range类,用于遍历
// #include <string> class Range {
public: // for(auto i:Range(1,10);
// 这个拆开就是这样:
// Range::RangeIterator it
// while( it != it.end() ) {
// i = *it
// it++
// }
//
// so,迭代器只需要支持操作符 * ++ != 即可
// class RangeIterator {
public:
explicit RangeIterator( long _var, long _step )
: var( _var ), step( _step ) {
}
RangeIterator& operator++() {
var += step;
return *this;
}
long operator*() {
return var;
}
bool operator!=( const RangeIterator& other ) {
// 递减时自身大于对比值
if( step < )
return (this->var > other.var);
return (this->var < other.var);
}
private:
long var, step;
}; //
// Range类只需要提供 beigin() end() 成员函数(返回迭代器)
//
explicit Range( long _begin, long _end, long _step = )
: begin_var( _begin ), end_var( _end ), step( _step ) {
}
RangeIterator begin() {
return RangeIterator( begin_var, step );
}
RangeIterator end() {
return RangeIterator( end_var, step );
} private:
long begin_var, end_var, step;
};

之后测试下:

 int main()
{
for( auto i : Range( , ) ) {
printf( "%d ", i );
} printf( "\n" );
for( auto i : Range( , , ) ) {
printf( "%d ", i );
} printf( "\n" );
for( auto i : Range( , , - ) ) {
printf( "%d ", i );
} printf( "\n" );
std::string str = "what the fuck?";
for( auto i : Range( , str.size() ) ) {
printf( "%c ", str[i] );
} return ;
}

C++ 实现Range类,用于常规遍历的更多相关文章

  1. C++11的for循环,以及范围Range类的实现

    C++11支持range-based for循环.这是一个很方便的特性,能省挺多代码.以下代码就能很方便的遍历vector中的元素,并打印出来: 1 2 3 4 5 6 7 8 std::vector ...

  2. System.ConfigurationManager类用于对配置文件的读取

    http://blog.csdn.net/ligenyingsr/article/details/54095986 System.ConfigurationManager类用于对配置文件的读取.其具有 ...

  3. javascript函数一共可分为五类: ·常规函数 ·数组函数 ·日期函数 ·数学函数 ·字符串函数

    javascript函数一共可分为五类:    ·常规函数    ·数组函数    ·日期函数    ·数学函数    ·字符串函数    1.常规函数    javascript常规函数包括以下9个 ...

  4. 框架中spring有专门的类用于处理乱码

    在三大框架spring中有专门的一个过滤器类用于处理乱码问题--->CharacterEncodingFilter 我们只需在web.xml中添加如下几行代码就可解决乱码问题 <filte ...

  5. net 提供了Thread类用于线程的操作

    net 提供了Thread类用于线程的操作. 当初始化一个线程,把Thread.IsBackground=true的时候,指示该线程为后台线程.后台线程将会随着主线程的推出而退出.后台线程不妨碍程序的 ...

  6. JSONArray ja = JSONArray.fromObject(list);//特殊类 用于将list转化为JSON 数据并返回 out.print(ja);

    JSONArray ja = JSONArray.fromObject(list);//特殊类 用于将list转化为JSON 数据并返回out.print(ja);

  7. 【TODO】Ruby Range类

    创建: 2017/10/28   Range类                                                                             ...

  8. 探索未知种族之osg类生物---渲染遍历之认识SceneView

    前言 我们在进行osg程序的开发时,最常用到的场景管理方式是“场景节点树”的结构,     a 场景树底端的叶节点(osg::Geode)包含了各种需要渲染的几何体的顶点和渲染状态信息:     b  ...

  9. List集合去重的一些方法(常规遍历、Set去重、java8 stream去重、重写equals和hashCode方法)

    1. 常规元素去重 碰到List去重的问题,除了遍历去重,我们常常想到利用Set集合不允许重复元素的特点,通过List和Set互转,来去掉重复元素. // 遍历后判断赋给另一个list集合,保持原来顺 ...

随机推荐

  1. PPP 转义字符 编码 和 解码

    #include <stdio.h> #include <string.h> // PPP数据帧每一帧都以标识字符0x7E开始和结束: // 由于标识字符的值是0x7E,因此当 ...

  2. 用MFC如何对子对话框进行初始化

    通常情况下,我们在创建子对话框的类时.cpp文件中并不会自动生成initdialog函数,但我们的很多操作都需要用到initdialog初始化函数,如果你直接在类的头文件中去定义一个初始化函数,然后在 ...

  3. 解决href标签跳转到WEB-INF下的jsp页面的办法

    用的配置struts的action的方法. jsp页面这样写的. class里面的路径是下面的struts配置文件的路径 struts配置文件里这样写的. name里面的内容要和href里面的内用一致 ...

  4. 自己瞎捣腾的Win7下Linux安装之路-----理论篇

    接着上回说道,我把双系统做好啦,开心.... 之后我就在想几个问题: 1.在Ubuntu装好后,重启电脑却还是win7,等我用EasyBCD之后,才可选择使用装好的Ubuntu呢? 2.在用EasyB ...

  5. php操作Memcache

    一.memcache基本的介绍 是一个高性能的分布式内存对象缓存系统. 和mysql比较,进行理解memcache (1)该软件是一个c/s架构, (2)mysql的数据是存储到哪里的?是存储到磁盘里 ...

  6. Android延时执行调用的几种方法

    一.开启新线程 new Thread(new Runnable(){        public void run(){            Thread.sleep(XXXX);          ...

  7. [THINKING IN JAVA]操作符

    3 操作符 3.1 static import 可以static import静态方法和变量,这样就可以在不写类名的前提下调用类中的静态方法和变量: package com.chenlei.study ...

  8. Python线程通信

    subprocess 作用 模块用于生产新的进程,连接到其输入.输出.错误管道,并获取其返回值 1. 如何使用subprocess模块 启动子进程的推荐方法是使用以下方便功能. 对于更高级的用例,当这 ...

  9. rhel 5.8 and 6.4 yum配置

    rhel 5.8 and 6.4 yum配置 6.4 [Packages]name=Packagesenabled=1gpgcheck=0baseurl=file:///iso 5.8 [Packag ...

  10. redis 3.2.6 on ubuntu 14.04

    1. official site: https://github.com/antirez/redis/releases 2. compile and setup tar zxf redis-3.2.6 ...