基于范围和deque与矢量的范围

Aru*_*run 1 c++ containers stl

我有一个类,它在容器内部保存指针,如下所示:

class A
{
public:

    A(int x) : _data(x){}

    A ** begin()
    {
        return v.empty() ? nullptr : &v[0];
    }

    A ** end()
    {
        return v.empty() ? nullptr : &v[0] + v.size();
    }

    void Display()
    {
        cout << "Data = " << _data << endl;
    }

    vector<A *> v;

private:

    int _data;
};
Run Code Online (Sandbox Code Playgroud)

现在我希望能够在A的对象上使用基于范围的循环,因此具有相同的成员开头和结尾.它按预期工作.但是如果我因为这里提到的原因尝试用双端队列替换向量,它会在尝试访问最后一个元素时崩溃.如果我实现end()的方式不正确,有人可以提供正确的吗?

Bri*_*ian 5

不同std::vector,std::deque不保证它连续存储其元素.所以一般来说指针算术不会做正确的事情.如果你想使用deque,而不是返回指针,你应该返回迭代器.

如果您真的将双端队列作为公共成员,那么直接返回可能是有意义的std::deque<A*>::iterator:

std::deque<A*>::iterator begin()
{
    return v.begin();
}

std::deque<A*>::iterator end()
{
    return v.end();
}
Run Code Online (Sandbox Code Playgroud)

但是,它可能(取决于你的应用程序)更好地将它作为私有成员和实现细节,在这种情况下,最好还是将A::iteratoriterator作为一个typedef进入底层容器类型,以避免不恰当地暴露实施细节:

typedef std::deque<A*>::iterator iterator;

iterator begin()
{
    return v.begin();
}

iterator end()
{
    return v.end();
}
Run Code Online (Sandbox Code Playgroud)