在网站中输入C++代码片段,它会展示编译器在编译过程中对代码所做的各种转换和优化。
一、分析
range-based-for模板源代码:
for(auto &elem:v){
}
经过编译器转换后的代码:
{
M_vector<int> & __range1 = v;
int * __begin1 = __range1.begin();
int * __end1 = __range1.end();
for(; __begin1 != __end1; ++__begin1) {
int & elem = *__begin1;
}
}
range-based-for的底层代码中先对遍历对象引用,取别名为__range1,然后调用__range1对象的begin和end方法,最后在for循环中遍历。
从上述代码可以看出,自定义类想要支持range-based-for必须满足以下条件:
- 自定义类支持begin()和end()方法返回迭代器
- 该迭代器支持!=运算符和前置++运算符的重载
二、自定义M_vector类实现支持range-based-for
由于该迭代器是T类的的指针,本身支持!=运算符和前置++运算符,所以只需实现begin和end即可。
template <class T>
class M_vector
{
// 成员函数
public:
using iterator = T *;
iterator begin()
{
return _start;
}
iterator end()
{
return _finish;
}
M_vector();
~M_vector();
void push_back(const T &value);
void pop_back();
int size() const;
int capacity() const;
private:
void reallocate(); // 重新分配空间
// 成员变量
private:
static allocator<T> _alloc;
T *_start;
T *_finish;
T *_end_of_storage;
};