В настоящее время я изучаю 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
гласит:
Вектор расширяется путем вставки новых элементов перед элементом в указанной позиции, эффективно увеличивая размер контейнера на количество вставленных элементов.
Таким образом, я ожидаю, что размер увеличивается на количество элементов, которые я добавил. Но когда я запускаю отладчик:
я получаю эти значения в первой точке останова:
А во второй точке останова size
увеличивается только на единицу:
Однако на втором проходе while l oop он пытается вставить еще двенадцать значений (size
равно 8, поэтому 20 - 8 == 12
):
И вдруг размер увеличивается до 22:
Это в настоящее время ломает мою программу, и я в значительной степени непонятно, почему мой код ведет себя так, как сейчас.