【问题标题】:Vector size increases only by one when insert with multiple elements插入多个元素时,向量大小仅增加一
【发布时间】:2020-08-11 09:13:13
【问题描述】:

我目前正在学习 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 是另一个向量,包含所有大小达到 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 的 documentation 声明:

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

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

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

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

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

然后突然大小跳到22:

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

【问题讨论】:

标签: c++ vector insert


【解决方案1】:

在这个sn-p中:

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

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

您是 inserting fromPtr 值 toPtr 的副本(即重载 (3))。根据您的描述,您的意思似乎是使用重载(4):

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

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

【讨论】:

  • 哇哦。我的错。我一遍又一遍地阅读了整个插入文档,但没有阅读关于 at 的文档。感谢您的快速回复!
猜你喜欢
  • 1970-01-01
  • 2019-10-12
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多