`
dqifa
  • 浏览: 116883 次
社区版块
存档分类
最新评论

for循环中调用vector容器erase函数

阅读更多

for循环中调用vector容器erase函数

代码示例

  1. int main(){  
  2.     vector<int> a;  
  3.     a.push_back(3);  
  4.     a.push_back(2);  
  5.     a.push_back(3);  
  6.     a.push_back(3);  
  7.     a.push_back(5);  
  8.     vector<int>::iterator b;  
  9.     int x = 3;  
  10.     for(b=a.begin();b!=a.end();b++)  
  11.     {  
  12.         if(*b==x){  
  13.             b=a.erase(b);  
  14.         }  
  15.     }  
  16.     for(b=a.begin();b!=a.end();b++)  
  17.     {  
  18.         printf("value=%d\n", *b);  
  19.     }  
  20.     return 0;  
  21. }  

现象&后果

上面代码的目的是,使用迭代器循环删除vector中所有的3,但你会发现并不是所有的3都被删除掉了。

Bug分析

上述代码主要问题是对容器类vector的erase函数理解不够。代码中调用的erase函数在删除当前元素b后,返回b后面的元素。在上述代码的vector中,一开始有3个3,其中后两个3是连续的,在删除第二个3之后,erase函数返回的下一个元素还是3,然而代码运行到循环的b++时,就略过了这个3,从而造成不是所有的3都被删除。

正确的做法是,在删除元素的之后,由于erase函数已经自动跳到下一个元素,跳过接下来循环的b++语句。

正确代码

  1. int main(){  
  2.     vector<int> a;  
  3.     a.push_back(3);  
  4.     a.push_back(2);  
  5.     a.push_back(3);  
  6.     a.push_back(3);  
  7.     a.push_back(5);  
  8.     vector<int>::iterator b;  
  9.     int x = 3;  
  10.     for(b=a.begin();b!=a.end();)  
  11.     {  
  12.         if(*b==x){  
  13.             b=a.erase(b);  
  14.         }else{  
  15.             b++;  
  16.         }  
  17.     }  
  18.     for(b=a.begin();b!=a.end();b++)  
  19.     {  
  20.         printf("value=%d\n", *b);  
  21.     }  
  22.     return 0;  
  23. }  

编程建议

在对容器类元素进行增、删操作时,一定要注意增、删操作的返回值和迭代器指示器是否发生变化,必要的时候需要进行修正。

from:http://book.51cto.com/art/201311/419438.htm

分享到:
评论

相关推荐

    c++之vector容器erase操作

    今天我们将深入探讨`vector`的一个关键成员函数——`erase()`,以及如何在容器中删除元素,特别是中间元素。 `std::vector::erase`函数是用来从`vector`中移除一个或多个元素的。它可以接受一个迭代器作为参数,这...

    vector中删除元素erase的用法

    在C++编程中,`std::vector`是一个非常重要的容器,它允许我们动态地存储一组相同类型的元素。在处理这些元素时,有时我们需要删除其中的一个或多个,这就是`erase`函数派上用场的地方。`erase`方法是`std::vector`...

    C++中vector容器使用详细说明

    在C++编程中,`vector`是一个非常重要的容器,它属于C++标准模板库(STL)的一部分。`vector`提供了一种动态数组的功能,允许在程序运行时改变其大小。以下是对C++中`vector`容器的详细说明: 1. **定义与特性** `...

    C++中Vector的使用

    vector提供了一系列的成员函数来操作容器中的数据,如push_back()、pop_back()、resize()等。push_back()函数可以在vector的尾部添加一个新元素,而pop_back()函数则删除vector尾部的元素。resize()函数可以改变...

    标准模板库STL的使用 实验报告.docx

    调用vector容器对象的insert()函数在容器对象的第1个位置上插入一个整型值,再调用copy算法把vector容器对象中的所有元素复制到list容器对象中,最后输出list容器对象中的所有元素。 知识点: 1. STL(Standard ...

    清华大学C++课件中vector用法实例

    函数对象(Function Object)是C++ STL中的一个概念,用于封装函数的调用。函数对象可以作为算法的参数,实现更加灵活地操作。下面是函数对象的使用示例: ```cpp class even_by_two { public: int operator()() ...

    C++ Vector 删除指定位置元素(csdn)————程序.pdf

    总结一下,C++的`std::vector`提供了`erase`函数,让我们能够方便地从容器中移除元素。理解`erase`函数的工作原理及其不同重载版本的用法,对于高效地管理`vector`中的数据至关重要。在处理动态数据集时,合理使用`...

    vector的earse造成迭代器失效的问题

    - 在`std::vector`中,如果进行了重新分配内存的操作(例如调用`resize`使得容器容量改变),所有指向该容器的迭代器都将失效。 #### 二、解决方法 针对上述问题,可以采取不同的策略来处理迭代器失效的情况: 1...

    c++中vector的用法详解.doc.pdf

    10. `size()`函数可以回容器中实际数据的个数。 11. `begin()`函数可以返回指向容器第一个元素的迭代器。 12. `end()`函数可以返回指向容器最后一个元素的迭代器。 内存管理与效率 1. 使用`reserve()`函数可以提前...

    C++中vector容器的用法

    - **迭代器访问**:通过`vector&lt;T&gt;::iterator it`定义迭代器,然后使用`for`循环遍历`vector`,例如`for(it=vec.begin(); it!=vec.end(); it++)`。 - **插入元素**:`vec.insert(iter, value)`在迭代器`iter`指向...

    C语言下的vector

    为了在C语言中实现类似STL(Standard Template Library)的`vector`功能,我们需要自定义一个数据结构,并提供相应的操作函数来模拟动态数组的行为。 在`vector.c`和`vector.h`这两个文件中,开发者可能已经创建了...

    c++中vector的用法详解.doc.docx

    本文将详细介绍 C++ 中 vector 的用法、函数调用和内存管理机制。 vector 的用法 1. 文件包含:在程序开头处加上 `#include &lt;vector&gt;` 以包含 vector 头文件,并加上 `using namespace std;` 以使用标准命名空间。...

    c++中vector的用法详解vector类用法.docx

    C++中vector的用法详解 vector是C++中的一种动态数组,相当于一个类,允许程序员在不知道数组规模的情况下动态地添加或删除元素,以达到最大节约空间的目的。 文件包含 在使用vector之前,需要在程序开头处加上`#...

    c++中vector的用法详解.docx

    3. 具体的用法以及函数调用:可以使用 `push_back` 函数在数组的最后添加一个数据;使用 `at` 函数得到编号位置的数据;使用 `begin` 函数得到数组头的指针;使用 `end` 函数得到数组的最后一个单元+1 的指针;使用 ...

    大家注意vector, list, set, map成员函数erase

    当我们调用`erase`成员函数时,会从容器中移除指定元素。对于`vector`和`list`,处理方式有所不同: 1. **对于`vector`**,`erase`函数接受一个迭代器作为参数,它会删除迭代器所指向的元素,并返回一个新的迭代器...

    vector的用法.docx

    C++中的`std::vector`是一个非常重要的容器,它提供了动态数组的功能,允许我们在运行时改变其大小。在本文中,我们将深入探讨`vector`的基本用法、操作以及一些高级特性。 首先,`vector`的存入和输出是通过`push_...

    vector彻彻底底干干净净清理内存方法

    在C++编程语言中,`std::vector`是一种非常常用且强大的容器,它能够自动管理内存,提供连续的存储空间,并支持随机访问等特性。然而,在某些情况下,我们需要手动管理`vector`中的对象以释放不再使用的资源,尤其是...

    容器和算法面经.docx

    在C++编程中,容器和算法是两个核心概念,它们是标准模板库(STL)的重要组成部分。容器是用于存储数据的类,而算法则是处理这些数据的操作。以下是对这两个主题的一些关键知识点的详细说明。 **1. 容器:set和map...

    顺序容器 顺序容器

    当在`vector`或`deque`容器中插入元素时,程序需要确保迭代器在每次循环后都得到更新。这是因为插入操作可能导致迭代器失效。此外,不要存储`end`操作返回的迭代器,因为添加或删除容器内的元素可能会导致存储的迭代...

Global site tag (gtag.js) - Google Analytics