首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >while循环与for循环中的迭代器无效

while循环与for循环中的迭代器无效
EN

Stack Overflow用户
提问于 2020-03-07 17:41:10
回答 1查看 99关注 0票数 1

在while vs for循环中如何处理迭代器无效?

例如,此代码不起作用,因为迭代器在插入后失效:

代码语言:javascript
复制
    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循环,它就能正常编译和运行:

代码语言:javascript
复制
   for(auto curr = iter; curr != mid; ++curr){
        if(*iter == 5){
            iter = v.insert(iter, 0);
            iter++;
        }
        iter++;
    }

为什么for循环可以工作,而while循环不能工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-07 17:45:40

这两个循环都是不正确的,因为在向量中插入元素后,迭代器mid变得无效。可以重新分配为向量的元素分配的内存。

为了实现您正在尝试做的事情,最好引入一个迭代计数,例如

代码语言:javascript
复制
auto n = v.size() / 2;

for ( auto iter = v.begin(); n != 0; n-- )
{
    if( *iter == 5 )
    {
        iter = v.insert(iter, 0);
        iter++;
    }
    iter++;
}

这是一个演示程序。

代码语言:javascript
复制
#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;
}

程序输出为

代码语言:javascript
复制
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

或者循环看起来像这样

代码语言:javascript
复制
for ( auto it = v.begin(); n--; ++it )
{
    if ( *it == 5 )
    {
        it = v.insert( it, 0 );
        ++it;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60576239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档