假设我们有一个类,例如class Apple
,并且想存储包含std::vector
的{{1}}。
向量应包含指针,引用还是普通对象?
Apple
我的目标是打电话给
std::vector<Apple*> vector; // Definitely won't copy the Apple on lookup,
// but I would prefer not to use pointers if I don't have to
std::vector<Apple&> vector; // Seems circuitous?
std::vector<Apple> vector; // I don't know if this copies the Apple on each lookup
Apple& a = vector[4];
将不会被复制。
我已经使用C ++一年多了,我一直都在解决这个问题,却从未理解过。为什么这三种方法之一是最佳实践,是否有简单的解释?
答案 0 :(得分:20)
使用类型T
。请记住,operator[]
返回一个(const)引用,因此您的Apple&
在此处正常工作:
T& vector<T>::operator[](size_t);
const T& vector<T>::operator[](size_t) const;
这就是为什么如果存在vec[3].make_older()
时可以使用return_type Apple::make_older(void)
的原因。
但是,请记住,有许多 方法会使引用无效,所以
Apple& reference = vec[3];
vec.push_back(other_apple);
reference.get_eaten();
如果push_back
重新分配了引用的苹果,则可能导致不确定的行为。
答案 1 :(得分:11)
使用:
std::vector<Apple> vector; // I don't know if this copies the Apple on each lookup
尽管所有这些都可以实现您的目标(查找永远不会复制),但是这是一种允许vector
拥有其中Apple
的位置,以便合理管理生命周期的方法。 / p>