C++ 11 for-range 访问容器简单实现

C++ 11 标准里对容器的访问提供了一种简单的方法 for-range,不用像以前使用for_each或者迭代器的访问模式。

例如:

vector<int> iv(10);
for (auto v : iv) {
    cout << v << endl;
}

使用起来较之前方便不少。

我们怎么在自己实现的容器上使用这种方法呢,我自己使用一个简单的示例测试了一下。

有这样一个简单的容器:

// sc.h 简单容器类
#ifndef _SC_H_
#define _SC_H_

#include "sci.h"

class SimpleContainer
{
public:
    friend class SimpleContainerIter;

    SimpleContainer(int size);

    ~SimpleContainer();

    SimpleContainerIter begin();

    SimpleContainerIter end();

private:
    int * content_; 
    int size_;
};

#endif
// sc.cpp
#include "sc.h"
#include "sci.h"

SimpleContainer::SimpleContainer(int size) : size_(size)
{
    content_ = new int[size];
    // init content 0 ~ 99
    for (int i = 0; i < size; ++i) {
        content_[i] = i;
    }
}

SimpleContainer::~SimpleContainer()
{
    delete[] content_;
    size_ = 0;
}

SimpleContainerIter SimpleContainer::begin()
{
    SimpleContainerIter sc(content_);
    return sc;
}

SimpleContainerIter SimpleContainer::end()
{
    SimpleContainerIter sc(content_ + size_);
    return sc;
}

要for-range好用,要提供一个针对这个容器的迭代器:

// sci.h 迭代器类
#ifndef _SCI_H_
#define _SCI_H_

class SimpleContainerIter
{
public:
    SimpleContainerIter(int * pos);

    int operator* () const;

    bool operator != (const SimpleContainerIter & iter) const;

    const SimpleContainerIter & operator ++ ();

private:
    int * pos_;
};

#endif
// sci.cpp 
#include "sci.h"
#include "sc.h"

SimpleContainerIter::SimpleContainerIter(int *pos) : pos_(pos) 
{

}

int SimpleContainerIter::operator* () const
{
        return *pos_;
}

bool SimpleContainerIter::operator!= (const SimpleContainerIter & iter) const
{
        return this->pos_ != iter.pos_;
}

const SimpleContainerIter & SimpleContainerIter::operator ++ () 
{
        ++pos_;
        return *this;
}

迭代器类提供了几种操作符的重载。

测试一下:

// main.cpp 测试
#include <iostream>

using namespace std;

#include "sc.h"

int main(int argc, char * argv[])
{
    SimpleContainer sc(100);

    for (auto v : sc) {
        cout << v << endl; 
    }

    return 0;
}

打印出 0 ~ 99。

总结: 本简单示例容器只支持 int 类型,如要支持更多类型,可以使用模板来实现。

注意: 编译本例编译器需支持C++11,加入编译选项 -std=c++11 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值