使用begin()和end()迭代指针

时间:2015-01-14 19:06:20

标签: c++ c++11 iterator

我有一个包含动态数组的类,我想使用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之间,我如何自动迭代这个结构?

1 个答案:

答案 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为指针类型。