先看一下类的设计与实现:
class MyStack { public: MyStack() = default; MyStack(int* p,size_t len):d(p),size(len){} int* begin() { return d; } int* end() { return &d[size]; } private: int* d = nullptr; size_t size = 0; };
这个类,按照要求必须实现begin和end函数才能实现范围循环,所以这两个函数必须存在。
范围循环的原理其实解释迭代循环的实现:
for(auto i = t.begin();i!=t.end();++i){...}
除了要求提供begin函数外还要求begin函数返回的类型支持++操作。
end是返回容器的最终位置,因为不会为其解引用,所以他不会崩溃,end的返回类型并不一定非要和begin的返回类型一致,只需要end能和begin比较即可。
int main() { int buf[10]{ 1,2,3,4,5,6,7,8,9,10 }; MyStack a(buf, 10); for (auto& i : a) { std::cout << i << " "; } return 1;
}
当然了,上面这是只为左值类型实现的范围循环,const类型,需要重载const版本的begin和end,我这里就不做重复动作了,感兴趣的可以自己试一下。
可以加我Q群一起学习:750965328
标签:容器,begin,end,自定义,int,C++,循环,MyStack,size From: https://www.cnblogs.com/Super-biscuits/p/18226743