我有一个包含动态数组的类,我想使用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楼 票数:4 已采纳

您尚未显示_deque的填充位置,但这可能来自一堆单独的分配?

问题是要遍历数组,您需要指向它。 但是您正在从数组中读取。

指向_deque的指针将是begin() { return _deque + _front; } end() { return _deque + _back; } begin() { return _deque + _front; } end() { return _deque + _back; } 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为指针类型。

  ask by Mike Cluck translate from so

未解决问题?本站智能推荐:

6回复

不能在数组上使用.begin()或.end()

错误如下: 请求'arr'中的成员'begin','end'是非类型int [5],无法从表达式错误中推断出来。 我的代码:
4回复

`std::string::begin()`/`std::string::end()`的迭代器失效?

此代码将begin() const的结果与end()的结果混合在一起。 这些函数都不允许使任何迭代器无效。 但是我很好奇是否要求end()不使iterator变量begin失效实际上意味着变量begin可以用于end 。 考虑一下C ++ 98, std::string copy-on-
4回复

STL算法将整个容器而不是.begin(),end()作为arg?

独立的STL算法(如std::count_if )采用一对迭代器。 在我使用它们的所有情况下(以及我在网上看过的所有例子中),我发现自己打字了 是否有为什么样式的速记模板的原因 鉴于在整个集装箱上进行的操作不是很多而没有提供? 我只是忽略了它吗? 答案是否与c ++ 11和c ++
2回复

为什么unordered_map没有rbegin()或rend(),但只有begin()和end()

使用begin(),end()和forward迭代器遍历unordered_map似乎很奇怪。 如果是这样,为什么它也没有rbegin(),rend()和双向迭代器呢? 有什么技术原因吗?
6回复

为什么std::begin和std::end“不安全存储”?

在此博客文章中 ,Eric Niebler指出: std :: begin和std :: end有什么问题? 惊喜! 它们不是内存安全的。 考虑一下这段代码的作用: std :: begin对于const和非const左值有两个重载。 麻烦的是,右值绑定到const左值引用
4回复

在成员函数返回的向量上调用begin和end

我有这个课: 我可以这样使用吗? 第一个f.get_v()指向第二个f.get_v()的相同向量吗?
1回复

向量和列表的end()迭代器的语义

根据C ++标准,如果向量的新大小超过其容量,则在向量上调用push_back()会使迭代器无效,但在列表上它永远不会使迭代器失效。 现在考虑以下代码片段: 1。 2。 我用gcc 4.8尝试了它,发现代码1完成, v为{1,2,3,1,2,3} ,但代码2运行到无限循环。 这个
3回复

迭代器失效-end()是否计为迭代器?

我使用std::multimap::equal_range()和insert()遇到了以下问题。 根据cplusplus.com和cppreference.com , std::multimap::insert不会使任何迭代器无效,但以下代码会导致无限循环: 目的是使用特定键(在这种情况