对象的std :: vector应该使用指针,引用还是什么都不使用?

时间:2018-12-24 18:05:01

标签: c++ stl

假设我们有一个类,例如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 ++一年多了,我一直都在解决这个问题,却从未理解过。为什么这三种方法之一是最佳实践,是否有简单的解释?

2 个答案:

答案 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>