Добавление указателя в вектор объектов

Я пытаюсь понять указатели в C++, но не могу найти ответа на эти вопросы.

Если бы у меня был ArrayList в Java, и я хотел бы добавить к нему новые объекты в цикле, я бы сделал что-то вроде:

ArrayList<MyObject> list = new ArrayList<MyObject> ();

for (int i = 0; i < otherList.length; i++) {
    list.add(i, new MyObject(otherList.get(i)));
}

Но допустим, я хотел сделать то же самое в C++, используя векторы. Я нашел два метода:

vector<MyObject> vector;

for (auto i = otherVector.begin(); i != otherVector.end(); i++) {
    // do this
    vector[i - otherVector.begin()] = * new MyObject(*i);

    // or this
    MyObject newObj(*i);
    vector[i - otherVector.begin()] = newObj;
}

В чем разница между этими двумя методами, и если я использую второй, нужно ли мне вручную удалять указатели из списка? Если бы я использовал второй метод с интеллектуальными указателями, они были бы автоматически удалены контроллером gc, когда вектор больше не использовался?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
30
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Первый метод создает утечку памяти. Нет никакого спасения. Забудьте, что вы когда-нибудь слышали об операторе new.

if I use the second one, do I need to manually delete the pointers from the list?

В списке нет указателей.

Второй будет работать, и он уберет за собой, когда vector выйдет из области видимости. Но не делайте этого.

vector<MyObject> vector;

for (auto i = otherVector.begin(); i != otherVector.end(); i++) {
    // do this
    vector[i - otherVector.begin()] = * new MyObject(*i); // No, no, no, no.

    // or this
    MyObject newObj(*i); 
    vector[i - otherVector.begin()] = newObj; // Please don't.
}

Но вот один из способов сделать это. Нет петли. (И не называйте вещи «вектором».)

std::vector<my_object> vec(other_vector);

Если вы действительно любите лаконичность, сделайте следующее:

auto vec{other_vector};

Другие вопросы по теме