我想使用erase方法从向量中清除元素.但是这里的问题是元素不能保证在向量中只出现一次.它可能存在多次,我需要清除所有这些.我的代码是这样的:
void erase(std::vector<int>& myNumbers_in, int number_in)
{
std::vector<int>::iterator iter = myNumbers_in.begin();
std::vector<int>::iterator endIter = myNumbers_in.end();
for(; iter != endIter; ++iter)
{
if(*iter == number_in)
{
myNumbers_in.erase(iter);
}
}
}
int main(int argc, char* argv[])
{
std::vector<int> myNmbers;
for(int i = 0; i < 2; ++i)
{
myNmbers.push_back(i);
myNmbers.push_back(i);
}
erase(myNmbers, 1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这段代码显然崩溃了,因为我在迭代它时改变了向量的末尾.实现这一目标的最佳方法是什么?也就是说有没有办法做到这一点,而无需多次迭代矢量或创建一个矢量的副本?
我正在寻找一种在迭代时擦除矢量中某些元素的智能方法,并找到了这个问题.
当然,它对我不起作用,因为C++ 98没有lambdas.寻找remove_if信息,并在cppreferenc e 找到了这个.这就是我的代码的样子:
#include <algorithm>
#include <vector>
bool isOutageValid(const Outage& outage){
return outage.getEndTime() >= 0;
}
std::vector<Outage> outages;
// Some stuff to fill the vector
outages.erase(std::remove_if(outages.begin(), outages.end(), isOutageValid));
for(vector<Outage>::iterator o=outages.begin(); o!=outages.end(); o++){
std::cout << o->getStartTime() << " " << o->getEndTime() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我正在调试4个中断到一个向量,我知道第一个是无效的,其余的有效.执行擦除后,矢量大小为3,因此看起来没问题.但是如果我用for循环迭代来检查向量中的3次中断,则第二次被删除而不是第一次.
我甚至调试了isOutageValid方法,它是第一个唯一返回false的方法.我有什么错误吗?
这是我的代码:
std::vector<int> array;
array.push_back(1);
array.push_back(2);
array.push_back(3);
array.push_back(4);
array.push_back(5);
for (int i = 0; i < array.size(); i++) {
if(array[i]==2 || array[i]==5) {
array.erase(array.begin() + i);
printf("### REMOVED ###\n", array[i], i);
}
printf("inside val: %d | index: %d\n", array[i], i);
}
Run Code Online (Sandbox Code Playgroud)
但正如你所看到的,它输出:
inside val: 1 | index: 0
### REMOVED ###
inside val: 3 | index: 1
inside val: 4 | index: 2
### REMOVED ###
inside val: 5 | index: 3
Run Code Online (Sandbox Code Playgroud)
当我的"期望"是:
inside val: 1 | index: 0 …Run Code Online (Sandbox Code Playgroud)