前记
2 、实现end()
3 、实现 operator++()
4 、实现 operator!=(class& other)
例子
后记
在学习过程中总是感觉一开始都懂了,但过了一段时间后还是忘记了。或者给别人描述的时候说不清楚。为啥是这样,我想有这么几个原因:
1、从小受到填鸭式的教育,重记忆,所以每次只是记住了,并没理解
2、学习后,过了很长时间忘记了
3、记忆力不行
如何解决这种学了就忘了得问题呢?有人提出三个境界,what,how, why。如果想真正的掌握这些知识,需要付出更多的精力去了解这东西为啥这样用,发明这些知识的作者当时是如何想得,自己通过已知的知识,是否能推导出相应的一种模式。通过这种方式的理解,相信学习知识的效率更高。
C++提供了for range功能,如果自定义的类也想使用for range需要满足什么条件呢,通过观察和查阅资料,推理编译器编译后的结果和正常for循环的结果应给是一样的,正常for循环需要满足四个条件。
for(auto it = vec_int.begin(); it!= vec_int.end(); ++it) {
cout << *it << "\t";
}
测试后for range也需要满足这四个条件:
1、实现begin()2 、实现end()
3 、实现 operator++()
4 、实现 operator!=(class& other)
例子
#include <iostream>
#include <assert.h>
using namespace std;
class VecInt;
class Iter{
public:
Iter(VecInt* pVectInt, int pos) : pVecInt_(pVectInt),
pos_(pos)
{
}
const Iter& operator++() {
++pos_;
return *this;
}
bool operator!=(Iter other) {
return other.pos_ != pos_;
}
int operator*();
private:
VecInt* pVecInt_;
int pos_;
};
class VecInt{
public:
VecInt() {
index_ = 0;
max_ = 1;
data_ = new int[max_]();
}
~VecInt() {
if(max_ > 0) {
delete []data_;
max_ = 0;
index_ = 0;
}
}
int get(size_t pos) {
assert(pos >= 0 && pos <= index_);
return data_[pos];
}
void realloc() {
max_ = max_ * 2;
int* temp = new int[max_]();
for(size_t i = 0; i < index_; ++i) {
temp[i] = data_[i];
}
delete []data_;
data_ = temp;
}
Iter begin() {
return Iter(this, 0);
}
Iter end() {
return Iter(this, index_);
}
void push_back(int value) {
if(index_ >= max_) {
realloc();
}
data_[index_] = value;
index_ = index_ + 1;
}
private:
size_t max_; // the int array length
size_t index_; // current array index
int* data_; // the int array pointer
};
// use the VecInt member function so define after the
// VecInt define the function
int Iter::operator*() {
return pVecInt_->get(pos_);
}
int main() {
VecInt vec_int;
for(auto i = 1; i < 10; ++i) {
vec_int.push_back(i);
}
for(auto it : vec_int) {
cout << it << "\t";
}
cout << endl;
}
程序很简单,实现了一个动态数组类, 和数组迭代器,在稍微比较难的地方,做了简单的注释,enjoy the code。
后记
在学习过程中总是感觉一开始都懂了,但过了一段时间后还是忘记了。或者给别人描述的时候说不清楚。为啥是这样,我想有这么几个原因:
1、从小受到填鸭式的教育,重记忆,所以每次只是记住了,并没理解
2、学习后,过了很长时间忘记了
3、记忆力不行
如何解决这种学了就忘了得问题呢?有人提出三个境界,what,how, why。如果想真正的掌握这些知识,需要付出更多的精力去了解这东西为啥这样用,发明这些知识的作者当时是如何想得,自己通过已知的知识,是否能推导出相应的一种模式。通过这种方式的理解,相信学习知识的效率更高。