目前,我正在学习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。此函数始终返回当前Vector中剩余的“免费”条目。
为了避免必须将输入向量中的每个单个值插入较小的向量中,我尝试在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
指出:
通过在指定位置的元素之前插入新元素来扩展向量,从而通过插入的元素数量有效地增加容器大小。
因此,我希望大小会随着元素数量的增加而增加。但是当我运行调试器时:
但是,在while循环的第二遍,然后尝试插入另外十二个值(size
仍然为8 20 - 8 == 12
):
这目前正在破坏我的程序,我几乎不知道为什么我的代码会以当前的方式运行。
在此片段中:
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
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句