我想循环遍历向量并擦除对应于特定条件的某些元素,例如:
vector<int> myvector;
vector<int>::iterator it;
myvector.push_back(1);
myvector.push_back(2);
myvector.push_back(3);
myvector.push_back(4);
for(it = myvector.begin(); it != myvector.end(); ++it){
if((*it) == 4){
it = myvector.erase(it);
}
}
Run Code Online (Sandbox Code Playgroud)
现在这个工作正常,除非标准删除了上面代码中的最后一项.你怎么避免这种行为?
谢谢.
编辑 - - - - - - - - - - - - - - - - - -
现在我循环它的原因是我需要从中删除元素实际上有4个向量(但标准仅在一个向量上):
在这种情况下,这是怎么走的?
vector<int> myvector;
vector<int> myvector2;
vector<int> myvector3;
vector<int> myvector4;
vector<int>::iterator it;
vector<int>::iterator it2;
vector<int>::iterator it3;
vector<int>::iterator it4;
myvector.push_back(1);
myvector.push_back(2);
myvector.push_back(3);
myvector.push_back(4);
Run Code Online (Sandbox Code Playgroud)
(假设myvector2/3/4中有值)
it2 = myvector2.begin()
it3 = myvector3.begin()
it4 = myvector4.begin()
for(it = myvector.begin(); it != myvector.end();){
if((*it) == 4){
it = myvector.erase(it);
it2 = myvector2.erase(it2);
it3 = myvector3.erase(it3);
it4 = myvector4.erase(it4);
}
else{
++it;
++it2;
++it3;
++it4;
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,擦除/删除习惯用法是否有效?
通常是删除/擦除习惯用法,它看起来像这样:
myvector.erase(std::remove(myvector.begin(), myvector.end(), 4), myvector.end());
Run Code Online (Sandbox Code Playgroud)
编辑:重读你的问题,你提到"某些标准".如果条件不一定只是删除单个值,则可以使用std::remove_if而不是std::remove,并在仿函数中指定您的条件.
Edit2:对于处理四个向量的版本,通常的方法是创建一个包含四个相关值的结构,并删除整个结构:
struct x4 {
int a, b, c, d;
// define equality based on the key field:
bool operator==(x4 const &other) { return a == other.a; }
x4(int a_, int b_=0, int c_=0, ind d_=0) : a(a_), b(b_), c(c_), d(d_) {}
};
std::vector<x4> myvector;
myvector.erase(std::remove(myvector.begin(), myvector.end(), x4(4));
Run Code Online (Sandbox Code Playgroud)
同样,如果您的标准比您在比较运算符中可以轻松表达的更复杂,则可以使用std::remove_if而不是std::remove.如果/当您可能需要在不同时间应用不同的标准时,这也很有用.
如果你真的需要将数据保存在并行向量中(例如,你将数据提供给需要单独的连续数组的外部数据),那么使用循环可能与替代方案一样好.