Как вставить векторы в очередьиспользуя цикл? - PullRequest
3 голосов
/ 20 июня 2019

Я хочу вставить векторы в мою очередь, используя следующий код:

queue<vector<int>> q;

for(int i=0;i<10;i++) {
    vector<int> t(3,-1);
    q.push(t);
}

vector<int> p = q.front();
q.pop();

Это правильно?Я обеспокоен тем, что, поскольку t определен только внутри цикла, он будет уничтожен, как только цикл закончится.Так будут ли сохраненные векторы все еще существовать в очереди после завершения цикла?

У меня был похожий код, который вызывал ошибку сегментации, поэтому я подумал, что это может быть проблемой.

Ответы [ 2 ]

2 голосов
/ 20 июня 2019

Поскольку @lubgr упомянул в своем ответе, что это правильно, контейнер будет иметь копию аргумента при использовании std::queue::push

Использование std::queue::emplace более эффективно, так как он помещает новый элемент в контейнертаким образом, временные данные не создаются и операции копирования / перемещения не выполняются

Вы пометили этот вопрос стандартом C ++ 14, std::queue::emplace доступно, поскольку C ++ 11

https://en.cppreference.com/w/cpp/container/queue/emplace

1 голос
/ 20 июня 2019

Это правильно?

Да.При использовании со стандартным std::deque бэкэндом std::queue::push(const T&) копирует свой аргумент в базовый контейнер через его внутренний экземпляр std::deque.Когда аргумент выходит из области видимости, это нормально, q владеет своей собственной копией.

Обратите внимание, однако, что

q.push(std::move(t));

будет более эффективным, так как для этого требуется толькоСоздайте перемещение экземпляра вектора, который дешевле.Это снова безопасно, так как вы не используете t после перемещения его в очередь.

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