对2D或3D矢量使用擦除-删除习惯用法
Using the erase-remove idiom for 2D or 3D vectors
当我尝试对循环内的2D向量使用vector.erase()
时,我会遇到分割错误。这是代码:
vector<vector<int> > fault;
...
...
for(i=0; i<10; i++)
{
for(j=0; j<fault.size(); j++)
{
if(pointer[i].val == fault[j][0])
fault.erase(fault.begin() + j); //ERROR HERE!
}
}
是因为矢量故障的大小发生了变化吗?我可以在这里使用删除习语吗?如果是,我该怎么做
非常感谢!
代码不会在您提到的行上导致分段错误。
可能是if语句导致了分段错误。因为pointer
不包含10个有效元素,或者因为fault
在其包含的所有向量中都没有元素0(零)。
您可以尝试添加此检查:
for(i=0; i<10; i++)
{
for(j=0; j<fault.size(); j++)
{
if (fault[j].size() > 0)
{
if(pointer[i].val == fault[j][0])
fault.erase(fault.begin() + j);
}
}
}
顺便说一句,你的逻辑似乎是错误的,因为你没有测试向量中的所有元素,也就是说,当你擦除一个元素时,下一个元素的测试将被跳过。也许你需要这个:
for(i=0; i<10; i++)
{
for(j=0; j<fault.size(); )
{
if((fault[j].size()>0) && (pointer[i].val == fault[j][0]))
{
fault.erase(fault.begin() + j);
}
else
{
// Only increment when no erase is done
j++;
}
}
}
相关文章:
- C++14 中unordered_map矢量和擦除删除成语的奇怪行为
- 擦除是否删除 stl 无序列图元素使用的堆内存
- 当我不关心顺序并且没有重复项时,更快的擦除删除成语?
- 如何使用擦除和迭代器来删除二维向量中的项目
- 擦除删除成语的性能增益从何而来
- 矢量擦除错误,无法删除不完整的类型
- 为什么擦除+删除比删除更有效
- 如何根据某些值擦除/删除类对象的向量
- 为什么擦除-删除成语不适用于反向迭代器
- C++擦除-删除类型推断失败
- 使用擦除-删除范例将元素从一个向量移动到另一个向量
- 如何使用擦除删除习语从结构向量中删除值
- 有没有办法将擦除-删除成语与其他循环条件一起使用
- 对2D或3D矢量使用擦除-删除习惯用法
- 使用类型擦除删除C++11中的void*
- 为什么标准中没有提供擦除-删除习惯用法的便利助手
- 在c++中使用擦除-删除习语时,我应该通过引用传递吗?
- 对函数使用擦除-删除习惯用法<void(>
- 如何使用擦除-删除习惯用法并在循环中增加迭代器
- 如何在排序的向量上正确应用擦除-删除习惯用法