使用 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_backpush_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 成为指针类型。