我有一个包含动态数组的类,我想使用begin()
和end()
来迭代它。问题是我似乎无法使迭代部分正常工作。到目前为止它看起来像这样:
template<typename T>
class Deque {
T** _deque;
int _front;
int _back;
public:
Deque() {
_deque = new T*[10];
_front = 5;
_back = 5;
}
// push_back and push_front add elements to the list and move _front/_back
// ...
T* begin() {
return _deque[_front];
}
T* end() {
return _deque[_back];
}
};
但是,如果我使用push_back
和push_front
(完美地运作)向列表添加一些项目,那么试试这个
for (auto i : deque) {
cout << i << endl;
}
第一项始终是正确的,但所有后续对象都是垃圾,通常会超出数组的大小。
如果它被约束在_front
和_back
之间,我如何自动迭代这个结构?
答案 0 :(得分:4)
您还没有显示_deque
填写的位置,但可能来自一大堆单独的分配?
问题是要迭代一个数组,你需要指向它。但是你正在从数组中读取。
指向_deque
的指针为begin() { return _deque + _front; } end() { return _deque + _back; }
,其类型为T**
。
你现在拥有的东西在道德上等同于:
std::vector<T*> v;
...
auto it = *(v.begin()); // this is the first pointer stored *in* the container,
// not a pointer to the beginning of the container
auto end = *(v.end()); // this is not even the last pointer stored in the container,
// it is reading the element past the end!
for( ; it != end; ++it )
与正确的迭代完全不同:
auto it = v.begin();
auto end = v.end();
for( ; it != end; ++it )
您的_deque
变量很可能应该有T*
类型,而不是T**
,如果您想存储指针,请T
为指针类型。