Как вставить элементы очереди в вектор? - PullRequest
1 голос
/ 01 ноября 2010

у меня

typedef std::queue<MyObject*> InputQueue;
std::vector<InputQueue> inp_queue;

Теперь я хочу во время выполнения определить 5 очередей и поместить данные в эти очереди, например

inp_queue[1].push(new MyObject());

и т.д.

Я получил его для компиляции, но он сразу же выгружает ядро. Я предполагаю, что мне нужно сначала добавить очереди к вектору (они не создаются автоматически, как карта). Как добавить очередь без указателя на очередь?

EDIT:

Я действительно должен был указать, что используемый мной класс очереди - это не std :: queue, а вот этот: http://www.justsoftwaresolutions.co.uk/threading/implementing-a-thread-safe-queue-using-condition-variables.html

Я не ожидал, что компилятор пожалуется на это, иначе я бы сказал об этом заранее.

К сожалению, когда я компилирую приложение, я получаю эту ошибку компиляции.

g++ test.cpp
In file included from /usr/include/c++/4.4/deque:63,
                 from /usr/include/c++/4.4/queue:61,
                 from concurrentqueue.h:3,
                 from test.cpp:1:
/usr/include/c++/4.4/bits/stl_construct.h: In function ‘void std::_Construct(_T1*, const _T2&) [with _T1 = concurrent_queue<Packet*>, _T2 = concurrent_queue<Packet*>]’:
/usr/include/c++/4.4/bits/stl_uninitialized.h:187:   instantiated from ‘static void std::__uninitialized_fill_n<<anonymous> >::uninitialized_fill_n(_ForwardIterator, _Size, const _Tp&) [with _ForwardIterator = concurrent_queue<Packet*>*, _Size = long unsigned int, _Tp = concurrent_queue<Packet*>, bool <anonymous> = false]’
/usr/include/c++/4.4/bits/stl_uninitialized.h:223:   instantiated from ‘void std::uninitialized_fill_n(_ForwardIterator, _Size, const _Tp&) [with _ForwardIterator = concurrent_queue<Packet*>*, _Size = long unsigned int, _Tp = concurrent_queue<Packet*>]’
/usr/include/c++/4.4/bits/stl_uninitialized.h:318:   instantiated from ‘void std::__uninitialized_fill_n_a(_ForwardIterator, _Size, const _Tp&, std::allocator<_Tp2>&) [with _ForwardIterator = concurrent_queue<Packet*>*, _Size = long unsigned int, _Tp = concurrent_queue<Packet*>, _Tp2 = concurrent_queue<Packet*>]’
/usr/include/c++/4.4/bits/stl_vector.h:1035:   instantiated from ‘void std::vector<_Tp, _Alloc>::_M_fill_initialize(size_t, const _Tp&) [with _Tp = concurrent_queue<Packet*>, _Alloc = std::allocator<concurrent_queue<Packet*> >]’
/usr/include/c++/4.4/bits/stl_vector.h:230:   instantiated from ‘std::vector<_Tp, _Alloc>::vector(size_t, const _Tp&, const _Alloc&) [with _Tp = concurrent_queue<Packet*>, _Alloc = std::allocator<concurrent_queue<Packet*> >]’
test.cpp:18:   instantiated from here
/usr/include/c++/4.4/bits/stl_construct.h:74: error: no matching function for call to ‘concurrent_queue<Packet*>::concurrent_queue(const concurrent_queue<Packet*>&)’
concurrentqueue.h:12: note: candidates are: concurrent_queue<Packet*>::concurrent_queue()
concurrentqueue.h:12: note:                 concurrent_queue<Packet*>::concurrent_queue(concurrent_queue<Packet*>&)

Ответы [ 2 ]

3 голосов
/ 01 ноября 2010

Вы не выделили ни одной из 5 очередей. Попробуйте:

typedef std::queue<MyObject*> InputQueue;
std::vector<InputQueue> inp_queue(5);
inp_queue[1].push(new MyObject());

Кроме того, std::vector использует индексы, начинающиеся с 0, поэтому для вставки в первую очередь:

inp_queue[0].push(new MyObject());

Продолжение редактирования : в параллельной очереди, похоже, нет конструктора копирования. Это означает, что вы не можете поместить его в любой стандартный контейнер, поскольку он не удовлетворяет требованиям. Тип значения контейнера должен быть конструируемым и назначаемым для копирования.

0 голосов
/ 01 ноября 2010

Вы должны выделить память для пяти очередей:

for (size_t queue_num=0;queue_num<5;++queue_num)
  inp_queue.push_back(InputQueue());

или

inp_queue.resize(5,InputQueue());

Теперь вы можете сделать:

inp_queue[1].push_back(new MyObject);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...