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 。