Размер вектора увеличивается только на один при вставке с несколькими элементами - PullRequest
2 голосов
/ 27 апреля 2020

В настоящее время я изучаю C ++ и для своей текущей цели я хочу заполнить значения от vector A до vector X. vector X не должно быть больше 20. Для архивации у меня есть функция, которая проверяет, есть ли у текущего вектора свободное место. Если пробела не осталось, он заменяет текущий вектор новым вектором из шаблона (который уже содержит некоторые записи, которые должны быть одинаковыми для всех векторов):

int ChunkedBufferBuilder::checkNewBuffer() {
  int space_left = chunk_size - super::current.size();
  if (space_left == 0) {
    bufVec.push_back(super::current);
    super::current = tpl;
    space_left = chunk_size - super::current.size() ;
  }

  return space_left;
}

bufVec is другой вектор, содержащий все векторы, которые достигли размера 20. Эта функция всегда возвращает оставшееся количество «свободных» записей в текущем векторе.

Чтобы избежать необходимости вставлять каждое отдельное значение из входного вектора в меньшие векторы, я пытаюсь использовать здесь функцию insert:

ChunkedBufferBuilder* ChunkedBufferBuilder::push_back(const std::vector<uint8_t> &vec) {
  auto pos = 0;
  const auto size = vec.size();

  while (pos < size) {
    const int space_left = checkNewBuffer();
    const int to = (space_left > size - pos) ? size : pos + space_left;
    auto fromPtr = vec.at(pos);
    auto toPtr = vec.at(to);

    int size = super::current.size();

    super::current.insert(super::current.end(), fromPtr, toPtr);

    size = super::current.size();

    pos = to;
  }

  return this;
}

Обратите внимание, что второй size = super::current.size() был помещен мной для помощи в отладке. На следующих изображениях я установил две точки останова. Один в строке, где вызывается insert, а другой в назначении pos = to.

Документация из std::vector гласит:

Вектор расширяется путем вставки новых элементов перед элементом в указанной позиции, эффективно увеличивая размер контейнера на количество вставленных элементов.

Таким образом, я ожидаю, что размер увеличивается на количество элементов, которые я добавил. Но когда я запускаю отладчик:

я получаю эти значения в первой точке останова: Values of first breakpoint

А во второй точке останова size увеличивается только на единицу: Values of second breakpoint

Однако на втором проходе while l oop он пытается вставить еще двенадцать значений (size равно 8, поэтому 20 - 8 == 12): Values of first breakpoint (second pass)

И вдруг размер увеличивается до 22: Values of second breakpoint (second pass)

Это в настоящее время ломает мою программу, и я в значительной степени непонятно, почему мой код ведет себя так, как сейчас.

1 Ответ

4 голосов
/ 27 апреля 2020

В этом фрагменте:

auto fromPtr = vec.at(pos);
auto toPtr = vec.at(to);

super::current.insert(super::current.end(), fromPtr, toPtr);

вы вставляете fromPtr копий значения toPtr (т.е. перегрузка (3)). Из вашего описания видно, что вы хотите использовать перегрузку (4):

super::current.insert(super::current.end(), vec + pos, vec + to);

, которая копирует элементы из vec в super::current.

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