我有一个C ++向量,它有一些空白元素。我想从向量中删除任何空字符串元素。我试过这段代码:
for (i = 0; i < myvector.size();i++) {
if (myvector[i] == "") {
myvector.erase(myvector.begin()+i);
}
}
当我运行此代码时,我遇到了分段错误。它有什么问题吗?或者这个代码对你们任何人都有用吗?
答案 0 :(得分:8)
看起来你想要通常的删除 - 删除习语:
#include <algorithm>
#include <functional>
myvector.erase(std::remove_if(myvector.begin(), myvector.end(),
std::mem_fn(&std::string::empty)),
myvector.end());
答案 1 :(得分:0)
如果你有例如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的解决方案更优雅。
答案 2 :(得分:0)
首先,我为我的英语感到抱歉(我是巴西人,我正在使用 Google 翻译)。但是您的问题不完全是关于删除向量之外的项目,而是关于访问它的元素。考虑以下情况:我有一个向量 v = {1, 4, 2} 并且我想使用 for 和迭代器排除所有偶数。当迭代器到达第二个元素 (v [2]) 时,它将排除 4,使向量 {1,2}。但是在离开 for 循环之前,迭代器仍然指向第二个元素 (v [2]),也就是最后一个元素。当它退出时,迭代器将递增(i ++)并等于 v.end()。因此,即使它没有给出分段错误,算法也不会删除所有偶数,如果 v 等于 {1,3,4},它将给出分段错误。为了解决这个问题,当你使用 v.erase() 时,使用 i--(在你的代码的情况下,它不直接使用迭代器,将以相同的方式工作)。或者你可以使用增量条件,与上一个答案一样,但迭代器需要正确更新。