当插入多个元素时,向量大小仅增加一个 我目前正在学习C++,对于我当前的目标,我想把值从向量A < /代码>填充到向量x。代码>矢量X不得大于20。为了存档这个文件,我有一个函数来检查当前向量是否还有空间。如果没有剩余空间,它将使用模板中的新向量替换当前向量(该模板已包含一些条目,所有向量必须相同): int ChunkedBufferBuilder::checkNewBuffer(){ int space_left=chunk_size-super::current.size(); if(空格_左==0){ bufVec.推回(super::current); super::current=tpl; space_left=chunk_size-super::current.size(); } 返回空间_左; }

当插入多个元素时,向量大小仅增加一个 我目前正在学习C++,对于我当前的目标,我想把值从向量A < /代码>填充到向量x。代码>矢量X不得大于20。为了存档这个文件,我有一个函数来检查当前向量是否还有空间。如果没有剩余空间,它将使用模板中的新向量替换当前向量(该模板已包含一些条目,所有向量必须相同): int ChunkedBufferBuilder::checkNewBuffer(){ int space_left=chunk_size-super::current.size(); if(空格_左==0){ bufVec.推回(super::current); super::current=tpl; space_left=chunk_size-super::current.size(); } 返回空间_左; },c++,vector,insert,C++,Vector,Insert,bufVec是另一个包含所有大小达到20的向量的向量。此函数始终返回当前向量中剩余的“空闲”项 为了避免必须将输入向量中的每个值插入到较小的向量中,我尝试在此处使用insert函数: ChunkedBufferBuilder*ChunkedBufferBuilder::push_back(const std::vector&vec){ 自动位置=0; 常量自动大小=向量大小(); while(pos大小-位置)?大小:位置+空格左; 自动从PTR=矢量位置(位置); auto toPtr=车辆在

bufVec
是另一个包含所有大小达到20的向量的向量。此函数始终返回当前向量中剩余的“空闲”项

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

ChunkedBufferBuilder*ChunkedBufferBuilder::push_back(const std::vector&vec){
自动位置=0;
常量自动大小=向量大小();
while(pos大小-位置)?大小:位置+空格左;
自动从PTR=矢量位置(位置);
auto toPtr=车辆在(至)位置;
int size=super::current.size();
super::current.insert(super::current.end(),fromPtr,toPtr);
size=super::current.size();
pos=to;
}
归还这个;
}
请注意,第二个
size=super::current.size()
是我放在那里帮助调试的。在下面的图片中,我设置了两个断点。一个在调用
insert
的行上,另一个在
pos=to
赋值上

std::vector的定义说明:

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

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

我在第一个断点处获得以下值:

在第二个断点处,大小仅增加一个:

但是,在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);
您是PTR的
副本
toPtr
(即过载(3))。根据您的描述,您的意思似乎是使用重载(4):


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

的ptr
toPtr
不是指针。它们是在索引
pos
to
处找到的向量中的值。哦,哇。我的错。我已经一遍又一遍地阅读了整个insert文档,但没有阅读关于at的文档。感谢您的快速回复!
super::current.insert(super::current.end(), vec + pos, vec + to);