当前位置: 首页 > 知识库问答 >
问题:

迭代器无效的同时循环vs为循环

欧阳山
2023-03-14

迭代器无效是如何处理的,而不是循环?

例如,这段代码不起作用,因为迭代器在插入后无效:

    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循环无效?

共有1个答案

商麒
2023-03-14

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

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

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;
    }
}
 类似资料:
  • 问题内容: 此代码将导致无限循环的机会是什么? 实际上,这会导致无限循环。我的怀疑是因为我没有服用,是真的吗? 问题答案: 是。除非您不打电话,否则它将永远不会继续进行下一项。Beause 将返回您已在列表/集中添加的对象。

  • 问题 你在代码中使用 while 循环来迭代处理数据,因为它需要调用某个函数或者和一般迭代模式不同的测试条件。 能不能用迭代器来重写这个循环呢? 解决方案 一个常见的IO操作程序可能会想下面这样: CHUNKSIZE = 8192 def reader(s): while True: data = s.recv(CHUNKSIZE) if data ==

  • 本节我们探索的主题是迭代与循环。循环通常在计算机编程用用于自动执行重复性任务。 在Python中最常用的迭代形式就是for循环了。for循环允许你迭代出列表中所有的项,迭代出来后你可以做任何你想做的事情。 比如,我们创建了一个列表,并打印出其中所有元素的平方。 >>> for value in [0, 1, 2, 3, 4, 5]: ... print(value * value) ... 0 1

  • 问题内容: 我想了解更多有关的信息,所以如果我错了,请纠正我。 迭代器是一个对象,该对象具有指向下一个对象的指针,并作为缓冲区或流(即,链表)读取。它们特别有效,因为它们所做的只是通过引用而不是使用索引来告诉您下一步是什么。 但是我仍然不明白为什么会发生以下行为: 经过迭代器()的第一个循环后,就好像它已被消耗并且留空,因此第二个循环()不输出任何内容。 但是,我从未为变量分配新值。 循环幕后到底

  • 如何在迭代中更改python迭代器? 例如: 此打印: 我想打印: 编辑:抱歉,这个问题让人们感到困惑。我对为什么当我在for循环中尝试更改迭代器时,for循环在下一次迭代中忽略它很感兴趣。 其他人已经提交了一个答案来清除我的困惑。范围创建一个列表,然后for循环将迭代器分配给列表中的下一个变量。

  • 问题内容: 我第一次不了解PHP。我一直在脚本中使用for循环,while循环,foreach循环。我想知道 哪一个性能更好? 选择循环的标准是什么? 当我们在另一个循环中循环时应该使用哪个? 我一直想知道要使用哪个循环的代码。 很明显,我可以使用while编写上面的代码。希望有人能帮助我找出哪个循环更适合使用。 问题答案: 哪一个性能更好? 没关系 选择循环的标准是什么? 如果只需要遍历对象或数