c++ - 基于范围的和双端队列与 vector

标签 c++ stl containers

我有一个类,它在容器中内部保存指向它自己种类的指针,如下所示:

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 循环,因此为相同的对象编写了成员 begin 和 end。它按预期工作。但是,如果我出于上述原因尝试用双端队列替换 vector here ,它在尝试访问最后一个元素时崩溃。如果我实现 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();
}

关于c++ - 基于范围的和双端队列与 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25028801/

相关文章:

java - 如何加快Docker容器启动时间?

azure - Docker 镜像迁移方法(来自 azure 注册表的 Nexus)

c++ - 隐式调用构造函数时 std::move 的行为是什么?

c++ - 在 do...while 中放置一个开关

c++ - 我无法访问指向成员的指针。为什么?

C++ Windows 7 获取已安装驱动程序的符号名称

STL - STL map::find 函数在没有相等运算符的情况下如何工作?

c++ - 将不可复制的对象放入标准容器中

linux - 当部署到 Linux 环境时,.NET Core 中的 Environment.FailFast 会做什么?

c++ - 交换内部和外部 vector