c++ Vector.erase()导致分段错误
C++ Vector.erase() causing segmentation fault
我有一个c++向量,它里面有一些空白元素。我想从向量中删除任何空字符串元素。我试过这个代码:
for (i = 0; i < myvector.size();i++) {
if (myvector[i] == "") {
myvector.erase(myvector.begin()+i);
}
}
当我运行这段代码时,我得到一个分段错误。有什么问题吗?或者这段代码对你们有用吗?
看来您需要使用通常的删除-擦除习惯用法:
#include <algorithm>
#include <functional>
myvector.erase(std::remove_if(myvector.begin(), myvector.end(),
std::mem_fn(&std::string::empty)),
myvector.end());
如果你有例如vec=["A",","B","C"],你删除元素A[1],现在'vec'是长3而不是4,所以vec[3]导致分割错误。
试试这个:
for (vector<...>::iterator i=myvector.begin();
i != myvector.end(); /* do nothing here */) {
if (i->empty()) {
i=myvector.erase(i);
} else {
++i;
}
}
然而,Kerrek的解决方案更优雅。
首先,我为我的英语感到抱歉(我是巴西人,我正在使用谷歌翻译)。但是您的问题不仅仅是关于删除vector之外的项,而是关于访问它的元素。考虑以下情况:我有一个向量v ={1,4,2},我想使用for和迭代器排除所有偶数。当迭代器到达第二个元素(v[2])时,它将排除4,使向量{1,2}。但是在离开for循环之前,迭代器仍然指向第二个元素(v[2]),这是最后一个元素。当它退出时,迭代器将被加1 (i++)并等于v.p end()。因此,即使不给出分割错误,算法也不会去除所有的偶数,如果v ={1,3,4},则会给出分割错误。为了解决这个问题,当你使用v.r ease()时,使用i——(在你的代码中,它不直接使用迭代器,将以相同的方式工作)。或者您可以使用递增条件,就像前面的答案一样,但是需要正确更新迭代器。
相关文章:
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- 分段错误当我试图运行程序时出错
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 尝试使用集合函数时出现分段错误
- 我无法缩小此分段错误的原因
- g++的分段错误(在NaN上使用to_string两次时)
- 我是如何在这段代码中出现分段错误的
- 创建结构的数组时遇到分段错误
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 在 c++ 中实现 Trie 时出现分段错误
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- 为什么我遇到分段错误?
- 动态类的分段错误(家庭作业问题)
- 分段错误 - 读取初始化指针的数组
- 如何摆脱C ++中的分段错误错误?
- 使用 CTYPE 时出现分段错误
- 为什么代码给出分段错误?