Ryan's WorkSpace
  • 首页
  • 关于我
  1. 首页
  2. C++
  3. 正文

C++ 基于数值的range-base for

2018年07月10日 1078点热度 0人点赞 0条评论

内容纲要

C++11以后支持range-base for
ES6以后,JavaScript在使用for的时候可以这么写:

const obj = {
    a:'b',
    b:'c'
};

for(let i of obj) {
    console.log(i);
}
/* output:
b
c
*/

而在C++中 则写成:

vector<int>vec;
vec.push(1);
vec.push(2)l
for(auto i:vec) {
    cout << i << endl;
}
/* output
1
2
*/

而我们在数值范围的循环的时候,range-base for就用不了了.
在Python中我们可以使用

for i in range(0,5):
    print i

来实现基于范围的range-base for

因此为了在C++中实现类似的功能,我们可以自定义一个class并在其中封装iterator来实现。


#pragma GCC optimize("O3")

#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
#include <array>
#include <iterator>

using namespace std;

class range {
public:
    class iterator {
        friend class range;

    public:
        int operator*() const { return i_; }

        iterator &operator++() {
            ++i_;
            return *this;
        }

        iterator operator++(int) {
            iterator copy(*this);
            ++i_;
            return copy;
        }

        bool operator==(const iterator &other) const { return i_ == other.i_; }

        bool operator!=(const iterator &other) const { return i_ != other.i_; }

    protected:
        iterator(int start) : i_(start) {}

    private:
        int i_;
    };

    iterator begin() const { return begin_; }

    iterator end() const { return end_; }

    range(int begin, int end) : begin_(begin), end_(end) {}

private:
    iterator begin_;
    iterator end_;
};

template<typename T>
class reverse_iterator_class {
public:
    explicit reverse_iterator_class(const T &t) : t(t) {}

    typename T::const_reverse_iterator begin() const { return t.rbegin(); }

    typename T::const_reverse_iterator end() const { return t.rend(); }

private:
    const T &t;
};
using ll = long long;

template<typename T>
reverse_iterator_class<T> reverse(const T &t) {
    return reverse_iterator_class<T>(t);
}

于是,我们就可以这么用:

for(auto i:range(0,5)) {
    cout << i << endl;
}

相关

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: 暂无
最后更新:2018年07月10日

Ryan Lee

如果帮助到你,请点击广告,谢谢!

点赞
下一篇 >

文章评论

您需要 登录 之后才可以评论

如果帮助到你,请点击广告,谢谢!

用户您好!请先登录!
登录 注册
Social Media
Github: ryanlee2014
标签聚合
php Apache hustoj C++ JavaScript Java GitHub C
友链
Pacolyon
Lucien's blog
Slian's DreamWork
卡拉搜索
  • 0
  • 15,321
  • 5,558
  • 8
广告

COPYRIGHT © 2020 Ryan's WorkSpace. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

登录
注册|忘记密码?