【发布时间】:2020-10-13 22:31:27
【问题描述】:
我正在练习实现容器。我的目标是定义迭代器 begin() 和 end()
这样我就可以有for(auto x : v) 形式的循环。我的容器如下所示:
class Vector{
public:
Vector(initializer_list<double> numbers){
sz = numbers.size();
elem = new double[sz];
int i = 0;
for (auto it = numbers.begin(); it!=numbers.end(); ++it)
elem[i++] = *it;
}
~Vector(){delete [] elem;}
double* begin();
double* end();
private:
double* elem;
int sz;
};
选项 1
这就是我定义迭代器的方式(它们在我的测试用例中工作得很好)
double* Vector::begin(){
return elem;
}
double* Vector::end(){
return &elem[sz];
}
选项 2
这就是它们在C++之旅中的定义
double* Vector::begin(){
return &elem[0];
}
double* Vector::end(){
return &elem[0]+sz;
}
我的问题
据我所知,这两个选项都可以正常工作(假设容器非空)。与选项 1 相比,选项 2 是否有任何优势(反之亦然)?我很感激任何建议。
【问题讨论】:
-
double* Vector::end() { return elem + sz; }? -
附带说明,您的
Vector类违反了Rule of 3/5/0,因为它没有实现/删除复制构造函数和复制赋值运算符,以及移动构造函数和移动赋值运算符。除了作为一种学习体验之外,实现自定义Vector类而不是使用std::vector并没有真正的好处。
标签: c++ iterator containers