2017-02-03 24 views
0

У меня есть часть кода, которая будет работать в цикле и создаст std::vector на каждой итерации, поэтому я хочу использовать Boost's pool_allocator для повышения эффективности. Тем не менее, библиотека, я использую не позволяет мне пройти аллокатор в качестве аргумента шаблона:Создайте std :: vector, пройдя boost :: pool_allocator как аргумент

std::vector<int, boost::pool_allocator<int> > v; 

    // This doesn't work because the library doesn't support the new type with the custom allocator 
    library::processVector(v); 

Так я думал о переходе в распределителе в качестве аргумента, чтобы получить вокруг него:

auto pool{boost::pool_allocator<int>()}; 
std::vector<int> v(pool); 

Но это дает мне ошибку компиляции:

error: no matching function for call to ‘std::vector<int>::vector(int, boost::pool_allocator<int>&)’ 

Как я могу это исправить?

ответ

0

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

typedef boost::pool_allocator<int> pool; 
std::vector<int, pool> v(pool); 
+0

Хм, это несчастливо. Так что я думаю, что нет способа обойти это, если не исправить библиотеку? – JamesNZ

+0

Насколько я знаю, я боюсь. – jfly

0

Вам действительно нужен вектор, созданный на каждой итерации?

Как правило, вы создаете вектор за пределами цикла и .clear() на каждой итерации. Это позволяет повторно использовать уже выделенную память.

Конечно, это не поможет в любой ситуации. Например, если эта библиотека выйдет из вектора, присвоив ее другому std::move() или .swap(), это не поможет.

+0

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