Как зарезервировать память для std :: vectors в массиве std ::? - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть std::array с фиксированным номером (numLines = 4) std::vector;каждый std::vector будет содержать динамические номера элементов, для которых я знаю максимальный размер каждого std::vector (numMaxSteps = 32).

Таким образом:

std::array<std::vector<int>, numLines> mSequences;

, так как я обрабатываю аудиона более высокой скорости, для меня обязательно НИКОГДА не выделять память во время процесса (следовательно, он вызывает щелчки и глюки).

Но я не уверен, как reserve памятькаждый std::vector при инициализации.

Есть ли способ? Или мне нужно перебрать каждый элемент std::array и сделать .reserve(numMaxSteps)?

Обратите внимание, что мне нужно оставить .size()в 0: только .capacity() нужно расти.

Ответы [ 4 ]

1 голос
/ 12 апреля 2019

Экстраполируя ваш комментарий на ответ Маршалла:

Мне нужен только "причудливый" способ зарезервировать память при инициализации

Это не становится более привлекательным, чем IILE:

auto mSequences = []{
  std::array<std::vector<int>, nunLines> ret;
  for (auto& v : ret)
    v.reserve(maxCapacity);
  return ret;
}();

Лямбда будет вызываться автоматически, когда пришло время инициализировать mSequence, и благодаря чудесам NRVO будет инициализировать ее напрямую.

Может даже использоваться для инициализации сложных объектов, объявленных const.

И если идея IILE нарушает ваши стандарты кодирования, вы всегда можете сделать из нее именованную свободную функцию.

1 голос
/ 12 апреля 2019

Вы также можете создать тонкую оболочку, если не возражаете написать еще несколько букв при доступе к вектору:

struct vect32 {
    vect32() : vect(32) {}
    vector<int> vect;
};

array<vect32, 10> sequences;

sequences[0].vect.push_back(1);
0 голосов
/ 12 апреля 2019

То, что вы здесь описываете, кажется идеальным случаем для boost.static_vector .

Этот контейнер позволяет предварительно выделить размер времени компиляции, но после этого он поддерживает push() / pop() / insert() / remove() и т. Д., А функция size и итераторы учитывают реальное время выполнения. определенный размер.

0 голосов
/ 12 апреля 2019

Есть ли способ?Или мне нужно перебрать каждый элемент std::array и сделать .reserve(numMaxSteps)?

Вот так; -)

Но я согласен с @bartop;с вашими потребностями, вы должны рассмотреть array<array<int, 32>> вместо.

...