Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ pop_back()未删除向量元素c++;_C++_Vector - Fatal编程技术网

C++ pop_back()未删除向量元素c++;

C++ pop_back()未删除向量元素c++;,c++,vector,C++,Vector,我希望这不是一个重复的问题,但我在这里找不到解决我问题的答案 我已经创建了一个固定行和列长度的2D向量,然后用我运行的模拟中的信息填充它。我特意将行长度设置为比需要的长得多,因为我的一些模拟生成的数据比其他模拟生成的数据多 我所要做的就是从向量中删除没有提供任何数据的行。这是我的密码: int states = 13; int duration = 1000; vector<int> temp(states, -1); vector<vector<int> >

我希望这不是一个重复的问题,但我在这里找不到解决我问题的答案

我已经创建了一个固定行和列长度的2D向量,然后用我运行的模拟中的信息填充它。我特意将行长度设置为比需要的长得多,因为我的一些模拟生成的数据比其他模拟生成的数据多

我所要做的就是从向量中删除没有提供任何数据的行。这是我的密码:

int states = 13;
int duration = 1000;
vector<int> temp(states, -1);

vector<vector<int> > state_data(duration, temp);
    //Fill in some number of the rows
    int x=0;
    while(condition){
        state_data[x][1] = 3;    
        ...
        state_data[x][13] = 10;
        x++;
    }    

    for(int i =0; i < (state_data.size()-x+1); i++){
        state_data.pop_back();
    }

    // Also have tried this:
    // state_data.erase(x, state_data.size());
    return state_data;
}
int states=13;
int持续时间=1000;
向量温度(状态-1);
矢量状态_数据(持续时间、温度);
//填写一些行数
int x=0;
while(条件){
state_data[x][1]=3;
...
州数据[x][13]=10;
x++;
}    
对于(int i=0;i<(state_data.size()-x+1);i++){
state_data.pop_back();
}
//我也尝试过这一点:
//state_data.erase(x,state_data.size());
返回状态数据;
}
pop_back
版本不会给出错误,但不会删除行。无论我试图一次删除1个或多个参数,erase函数都会给出一个错误:
“候选者需要2个参数,提供1个”
,并且
“调用'std::vector::erase(int)'时没有匹配的函数”


我找到的所有关于擦除的答案都使用这两个函数给出了答案,我不明白为什么这两个函数都没有达到我想要的效果。我真的很感激你能给我的任何建议,为什么这些函数没有达到我想要的效果

首先,您在pop_back中遇到的问题是,每次pop_back的大小都在变化。考虑,如果x为5,向量大小为10,则计划移除5个元素,留下0到4。 首先,size-5+1是6,i是零,循环的块执行,i将增加到1

此时,大小-5+1将为5,i为1,循环继续。 当i==2时取4,当i==3时取3。循环将终止

此时,容器大小将为7。您希望它是五个,但由于每次弹出时大小都会减小,“计数器”正在接近缩小极限。您应该在循环之前计算大小-5+1,将其存储为'lim'或您喜欢的东西,在for循环中使用它来测试i。它可能会更好地查找向量的调整大小功能,它会为您做到这一点

此外,请注意使用[]创建的向量和访问的限制,尤其是直线

state_data[x][13] = 10;
您为13个条目分配了空间,但索引13是第14个条目。向量没有使用[]运算符扩展,因此应该崩溃

您可能需要考虑STD::数组用于一些设计选择,而不是向量,尤其是在设计中的内部向量,因为它们是较轻的、固定大小的分配。 现在,我们来谈谈创建行然后稍后删除行的概念。那真的没必要。有两种可能更好的解决方案

首先,考虑使用储备,而不是POP。爸爸可能不会做你想的事。它将删除行,减少向量中已知项的长度,但并不保证存储空间会减少(收缩时调整大小也是如此)。RAM块在创建时动态分配,或在扩展时重新分配,但vector可能不会在弹出时收缩任何存储。它占用的实际存储可能保持不变,这将是相同的结果,就好像您提前发布了一个存储储备,并将数据推后以填充一样

如果初始化的行数超过要求,并且随后弹出的原因与存储策略无关,而是与使用[]有关,那么您应该重新考虑并使用push_back,这样就可以避免性能损失和弹出最初不需要的所有“额外”行的额外复杂性

在这种情况下,戴克可能是一个更好的选择。Deques确实对“收缩”做出响应,在许多方面与向量功能非常相似,但允许在结构的两端推动和弹出,内部存储更灵活

您可以使用deque作为行的容器(外部容器),也可以使用std::array作为每个固定大小行的内部容器

这可能看起来像:

std::deque<std::array<int, 13> > state_data(duration, temp);
std::确定状态数据(持续时间、温度);

或者类似的东西,可能仍然作为内部存储器,取决于灵活性要求

首先
状态数据[x][13]=10在经过向量末尾时未定义。其次,
pop\u back()
怎么不起作用?请提供并注意,
state\u data.size()
的值会随着循环的执行而变化。存在一个
调整大小
功能–使用
状态数据。调整大小(x)
。感谢您的回答!尺寸值的变化绝对是我所缺少的。我最初分配的是很多额外的,而不是使用PuxiBuffor(),因为我不知道函数存在——我是C++的新手。我现在将使用push_back,它解决了所有问题。我真的很感谢你的回答和时间。而且,索引问题只是我的问题中的一个输入错误,而不是我的代码中的一个输入错误——我还没有弄清楚如何从vim复制我的文本并将其输入到其他程序中。当然。你会考虑“接受”这个答案,所以我得到一些代表点吗?