我有一个类,它在容器内部保存指针,如下所示:
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的对象上使用基于范围的循环,因此具有相同的成员开头和结尾。它按预期工作。但是如果我试图用提到的here的原因替换带有双端队列的向量,它会在尝试访问最后一个元素时崩溃。如果我实现end()的方式不正确,有人可以提供正确的吗?
答案 0 :(得分: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();
}
但是,它可能(取决于你的应用程序)更好地将它作为私有成员和实现细节,在这种情况下,拥有A::iterator
也可能更好,它可能只是迭代器的typedef进入底层容器类型,以避免不恰当地暴露实现细节:
typedef std::deque<A*>::iterator iterator;
iterator begin()
{
return v.begin();
}
iterator end()
{
return v.end();
}