Должен ли объект std :: vector использовать указатели, ссылки или ничего? - PullRequest
0 голосов
/ 24 декабря 2018

Предположим, у нас есть некоторый класс, скажем, class Apple, и мы хотим сохранить std::vector, содержащий 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];

Apple не было скопировано.

Я использую C ++ уже более года иЯ всегда работал над этим и никогда не понимал этого.Есть ли простое объяснение того, почему один из этих трех подходов является лучшим?

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Используйте тип T.Помните, что operator[] возвращает (постоянную) ссылку, поэтому ваш 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 перераспределит ссылочное яблоко.

0 голосов
/ 24 декабря 2018

Использование:

std::vector<Apple> vector; // I don't know if this copies the Apple on each lookup

Хотя все они достигнут вашей цели (поиск никогда не копируется), именно этот позволяет vector владеть Apple s в нем, так чтожизни разумно управляются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...