繁体   English   中英

插入多个元素时,向量大小仅增加一

[英]Vector size increases only by one when insert with multiple elements

我目前正在学习 C++ ,对于我目前的目标,我想将vector A中的值填充到vector X中。 vector X不能大于 20。为了存档,我有一个 function 来检查当前向量是否有剩余空间。 如果没有剩余空间,它将用模板中的新向量替换当前向量(该模板已经包含一些条目,所有向量必须相同):

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是另一个向量,包含所有大小为 20 的向量。此 function 始终返回当前向量中剩余的“免费”条目数量。

为了避免必须将输入向量中的每个值插入到较小的向量中,我尝试在此处使用insert function:

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 assignment 上。

std::vector文档指出:

通过在指定 position 的元素之前插入新元素来扩展向量,通过插入的元素数量有效地增加容器大小。

因此,我希望尺寸会随着我添加的元素数量而增加。 但是当我运行调试器时:

我在第一个断点处得到这些值: 第一个断点的值

而在第二个断点size只增加了一个: 第二个断点的值

然而,在 while 循环的第二遍,它会尝试插入另外 12 个值( size仍然是 8 所以20 - 8 == 12 ): 第一个断点的值(第二遍)

然后突然大小跳到22: 第二个断点的值(第二遍)

这目前正在破坏我的程序,我几乎不知道为什么我的代码会以目前的方式运行。

在这个片段中:

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

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

您正在插入toPtrfromPtr副本(即重载 (3))。 根据您的描述,您的意思似乎是使用重载(4):

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

它将元素从vec复制到super::current

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM