在while vs for循环中如何处理迭代器无效?
例如,此代码不起作用,因为迭代器在插入后失效:
vector <int> v = {1,5,5,5,5,2,3,4,5,6,7};
vector<int> :: iterator iter = v.begin();
vector <int> :: iterator mid = v.begin() + (v.end()-v.begin())/2;
while(iter != mid){
if(*iter == 5){
iter = v.insert(iter, 0);
iter++;
}
iter++;
}但是,如果我用这个for循环替换while循环,它就能正常编译和运行:
for(auto curr = iter; curr != mid; ++curr){
if(*iter == 5){
iter = v.insert(iter, 0);
iter++;
}
iter++;
}为什么for循环可以工作,而while循环不能工作?
发布于 2020-03-07 17:45:40
这两个循环都是不正确的,因为在向量中插入元素后,迭代器mid变得无效。可以重新分配为向量的元素分配的内存。
为了实现您正在尝试做的事情,最好引入一个迭代计数,例如
auto n = v.size() / 2;
for ( auto iter = v.begin(); n != 0; n-- )
{
if( *iter == 5 )
{
iter = v.insert(iter, 0);
iter++;
}
iter++;
}这是一个演示程序。
#include <iostream>
#include <vector>
int main()
{
std::vector <int> v = { 1, 5, 5, 5, 5, 2, 3, 4, 5, 6, 7 };
for ( const auto &item : v ) std::cout << item << ' ';
std::cout << '\n';
auto n = v.size() / 2;
for ( auto it = v.begin(); n != 0; n-- )
{
if ( *it == 5 )
{
it = v.insert( it, 0 );
++it;
}
++it;
}
for ( const auto &item : v ) std::cout << item << ' ';
std::cout << '\n';
return 0;
}程序输出为
1 5 5 5 5 2 3 4 5 6 7
1 0 5 0 5 0 5 0 5 2 3 4 5 6 7或者循环看起来像这样
for ( auto it = v.begin(); n--; ++it )
{
if ( *it == 5 )
{
it = v.insert( it, 0 );
++it;
}
}https://stackoverflow.com/questions/60576239
复制相似问题