C ++ Динамическое размещение векторов в векторе? - PullRequest
3 голосов
/ 14 ноября 2011

Я сейчас работаю с vector, и у меня есть интересная ситуация, с которой мне нужно помочь.

У меня есть вектор векторов, определенный следующим образом:

vector< vector<int> > list;

Я загружаю числа из стандартного ввода, используя cin >> helpVar;, и каждый раз, когда я получаю 0 (ноль), я хочу создать новый вектор целых чисел, который будет помещен в этот «основной контейнер»Конечно, я не знаю, сколько раз появится нулевое число - это зависит от пользователя.Поэтому я также не знаю, сколько векторов добавит программа.

Но я не знаю, как именно это сделать.Если бы я использовал C # или другой язык, похожий на сборщик мусора, я бы просто написал:

if(helpVar == 0)
{
   list.push_back(new vector<int>);
}

Но эта конструкция не работает в C ++.

Так что мой вопрос: какЯ справляюсь с этой ситуацией, чтобы она работала?Или я просто думаю об этом неправильно, и это должно быть сделано по-другому?

Спасибо за ответы.

Ответы [ 5 ]

7 голосов
/ 14 ноября 2011
list.push_back(vector<int>());

vector<int>() создает временный объект vector<int> и инициализирует его (т. Е. Вызывает конструктор по умолчанию для этого объекта).push_back затем копирует этот временный объект в list.

В C # (и «других языках с мусором») new используется для создания новых объектов, время жизни которых контролируется сборщиком мусора.

В C ++ new используется только для динамического выделения объекта (и вы отвечаете за управление его временем жизни с помощью умного указателя).Синтаксис T() (где T - имя типа) используется для создания временного объекта.

3 голосов
/ 14 ноября 2011

В C ++ 11:

list.emplace_back();

В C ++ 03:

list.push_back(std::vector<int>());

new динамически распределяет объект и дает вам указатель на него; vector::push_back() принимает ссылку на объект, который он будет копировать. Используйте new только тогда, когда вы хотите динамически распределить объект самостоятельно - в этом нет необходимости, если вы используете контейнеры для этого. Когда вы используете new, убедитесь, что вы используете умный указатель (или очень тщательно написанный код), чтобы удалить его, когда закончите с ним.

1 голос
/ 14 ноября 2011

Просто сделай

list.push_back(vector<int>());

Если вы говорите «новый», вы просите место в куче, но вам это не нужно. У вас уже есть зарезервированное пространство во внешнем векторе! Просто нажмите векторный объект (не указатель), и все будет готово!

Дополнительно: обратите внимание, что на самом деле сначала создает новый вектор во внешнем векторе, увеличив его размер на 1, затем создает новый временный вектор в стеке, а затем копирует содержимое более позднего (пустого). , так что ничего не поделать) сначала, затем уничтожает временный вектор в стеке. Но компилятор, вероятно, оптимизирует это полностью!

1 голос
/ 14 ноября 2011

В C ++ вы можете просто сделать:

x.push_back(T);

Управление памятью осуществляется самим классом.Надеюсь, я вас правильно понял.

Одна вещь, на которую вам нужно обратить внимание, - если класс, который вы отбрасываете назад, имеет объявленный конструктор по умолчанию.

1 голос
/ 14 ноября 2011

Вы можете

list.push_back(vector<int>());

в начале, добавить helpVar к самому последнему вектору, выполнив

list.back().push_back(helpVar);

, а когда вы получите 0, просто нажмите ещеновый вектор.

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