下面这个代码输出的是( )
#include <iostream>
#include <vector>
using namespace std;
int main(void)
{
vector<int>array;
array.push_back(100);
array.push_back(300);
array.push_back(300);
array.push_back(300);
array.push_back(300);
array.push_back(500);
vector<int>::iterator itor;
for(itor=array.begin();itor!=array.end();itor++)
{
if(* itor==300)
{
itor=array.erase(itor);
}
}
for(itor=array.begin();itor!=array.end();itor++)
{
cout<<*itor<<" ";
}
return 0;
}
代码试图从vector
中删除所有值为300的元素。然而,当使用vector::erase
方法时,需要注意返回的迭代器指向的是被删除元素之后的位置。在代码中,当删除一个元素后,立即使用相同的迭代器继续循环,这会导致跳过下一个元素。
这是因为在删除元素后没有更新迭代器的位置。当删除一个元素时,itor
现在指向一个已经不存在的元素,因此在下一次迭代中,会跳过下一个元素。
为了修复这个问题,需要在删除元素后更新迭代器的位置。可以通过递增itor
来做到这一点,但这只能在erase
调用之后做,因为erase
会返回一个指向已删除元素之后的位置的迭代器。
下面是修复后的代码:输出结果为100 500
#include <iostream>
#include <vector>
int main(void)
{
std::vector<int> array;
array.push_back(100);
array.push_back(300);
array.push_back(300);
array.push_back(300);
array.push_back(300);
array.push_back(500);
std::vector<int>::iterator itor;
for (itor = array.begin(); itor != array.end(); )
{
if (*itor == 300)
{
itor = array.erase(itor);
}
else
{
++itor; // 如果当前元素不是300,递增迭代器
}
}
for (itor = array.begin(); itor != array.end(); itor++)
{
std::cout << *itor << " ";
}
return 0;
}