使用 begin() 和 end() 迭代指针
Iterating Pointers with begin() and end()
我有一个包含动态数组的 class,我想使用 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
之间,我如何自动迭代它?
您没有显示 _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
成为指针类型。
我有一个包含动态数组的 class,我想使用 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
之间,我如何自动迭代它?
您没有显示 _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
成为指针类型。