скопировать вектор в очередь - PullRequest
1 голос
/ 23 января 2020

У меня есть вектор

 std::vector<OrderInfo *> vec

и очередь

queue<OrderInfo *> *myQueue = new queue<OrderInfo *>;

Я хочу скопировать вектор в очередь. Я пытался использовать Как мне скопировать весь вектор в очередь? этот ответ, а также этот Вставить в очередь STL с помощью std :: copy

, но это не так работает, как мне заставить это работать?

вот что я попробовал: myQueue = новая очередь (ve c .begin (), ve c .end ()); я получил

ошибка: нет подходящей функции для вызова 'std :: queue :: queue (std :: vector :: iterator, std :: vector :: iterator)' myQueue = new queue ( ve c .begin (), ve c .end ());

и когда я попробовал это:

std::copy(vec.begin(),vec.end(),std::back_inserter(myQueue));

я получил:

требуется от 'BacStrategy :: BacStrategy (EZXConnectionHandler &, const string &, bool, const double &, int) [with Event_Type = EZXOrderEventHandler; std :: __cxx11 :: string = std :: __cxx11 :: basic_string] '/home/yaodav/Desktop/git_repo/test/main.cpp:324:51: требуется здесь / usr / local / include / c ++ / 7.4.0 / bits / stl_iterator.h: 490: 7: ошибка: 'std :: queue *' не является оператором класса, структуры или типа объединения = (постоянное имя типа _Container :: value_type & __value)

1 Ответ

5 голосов
/ 23 января 2020

myQueue - это указатель , а не очередь и не может быть передан в std::back_inserter. Чтобы исправить это, не объявляйте его как указатель.

Кроме того, std::back_inserter нельзя использовать с std::queue, как объясняется во второй опубликованной ссылке.

Вместо , просто напишите

std::queue<OrderInfo*> myQueue{
    std::deque<OrderInfo*>(vec.begin(), vec.end())
};

Если вам действительно нужен указатель, измените код следующим образом:

std::queue<OrderInfo*>* myQueue = new std::queue<OrderInfo*>{
    std::deque<OrderInfo*>(vec.begin(), vec.end())
};

Наконец, если вам нужно заполнить уже инициализированную очередь, выполните следующие действия: создайте временную очередь, используя приведенное выше, и назначьте ее указателю:

*myQueue = std::queue<OrderInfo*>{std::deque<OrderInfo*>(vec.begin(), vec.end())};

Если это выглядит слишком грязно, вы также можете создать временную переменную для этой очереди - но в этом случае вам нужно использовать std::move чтобы гарантировать, что очередь получит назначенное перемещение, не дорого скопированное:

auto tmp = std::queue<OrderInfo*>{std::deque<OrderInfo*>(vec.begin(), vec.end())};
*myQueue = std::move(tmp);

В том же духе, тщательно продумайте, хотите ли вы хранить OrderInfo s вместо указателей на OrderInfo s.

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