我有一个用于在内部将指向其自身类型的指针保存在容器中的类,如下所示:

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;
};

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

最佳答案

std::vector不同,std::deque不保证它连续存储元素。因此,一般而言,指针算法不会做正确的事情。如果要使用双端队列,而不是将指针返回到双端队列,则应返回迭代器。

如果您实际上将双端队列作为公共(public)成员,则直接返回std::deque<A*>::iterator可能很有意义:

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

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

但是,最好将它作为私有(private)成员和实现细节(取决于您的应用程序),在这种情况下,最好将A::iterator用作基础容器类型的迭代器,使其成为typedef。避免不当地公开实现细节:
typedef std::deque<A*>::iterator iterator;

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

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

10-05 22:44