【发布时间】: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 声明:
通过在指定位置的元素之前插入新元素来扩展向量,通过插入的元素数量有效地增加容器大小。
因此,我预计尺寸会随着我添加的元素数量而增加。但是当我运行调试器时:
但是,在 while 循环的第二遍中,它会尝试插入另外 12 个值(size 仍然是 8,所以 20 - 8 == 12):
这目前正在破坏我的程序,我几乎不知道为什么我的代码会以目前的方式运行。
【问题讨论】:
-
fromPtr和toPtr不是指针。它们是在索引pos和to中找到的向量中的值。 en.cppreference.com/w/cpp/container/vector/at