for循环中调用vector容器erase函数
代码示例
- int main(){
- vector<int> a;
- a.push_back(3);
- a.push_back(2);
- a.push_back(3);
- a.push_back(3);
- a.push_back(5);
- vector<int>::iterator b;
- int x = 3;
- for(b=a.begin();b!=a.end();b++)
- {
- if(*b==x){
- b=a.erase(b);
- }
- }
- for(b=a.begin();b!=a.end();b++)
- {
- printf("value=%d\n", *b);
- }
- return 0;
- }
现象&后果
上面代码的目的是,使用迭代器循环删除vector中所有的3,但你会发现并不是所有的3都被删除掉了。
Bug分析
上述代码主要问题是对容器类vector的erase函数理解不够。代码中调用的erase函数在删除当前元素b后,返回b后面的元素。在上述代码的vector中,一开始有3个3,其中后两个3是连续的,在删除第二个3之后,erase函数返回的下一个元素还是3,然而代码运行到循环的b++时,就略过了这个3,从而造成不是所有的3都被删除。
正确的做法是,在删除元素的之后,由于erase函数已经自动跳到下一个元素,跳过接下来循环的b++语句。
正确代码
- int main(){
- vector<int> a;
- a.push_back(3);
- a.push_back(2);
- a.push_back(3);
- a.push_back(3);
- a.push_back(5);
- vector<int>::iterator b;
- int x = 3;
- for(b=a.begin();b!=a.end();)
- {
- if(*b==x){
- b=a.erase(b);
- }else{
- b++;
- }
- }
- for(b=a.begin();b!=a.end();b++)
- {
- printf("value=%d\n", *b);
- }
- return 0;
- }
编程建议
在对容器类元素进行增、删操作时,一定要注意增、删操作的返回值和迭代器指示器是否发生变化,必要的时候需要进行修正。
from:http://book.51cto.com/art/201311/419438.htm
相关推荐
今天我们将深入探讨`vector`的一个关键成员函数——`erase()`,以及如何在容器中删除元素,特别是中间元素。 `std::vector::erase`函数是用来从`vector`中移除一个或多个元素的。它可以接受一个迭代器作为参数,这...
在C++编程中,`std::vector`是一个非常重要的容器,它允许我们动态地存储一组相同类型的元素。在处理这些元素时,有时我们需要删除其中的一个或多个,这就是`erase`函数派上用场的地方。`erase`方法是`std::vector`...
在C++编程中,`vector`是一个非常重要的容器,它属于C++标准模板库(STL)的一部分。`vector`提供了一种动态数组的功能,允许在程序运行时改变其大小。以下是对C++中`vector`容器的详细说明: 1. **定义与特性** `...
vector提供了一系列的成员函数来操作容器中的数据,如push_back()、pop_back()、resize()等。push_back()函数可以在vector的尾部添加一个新元素,而pop_back()函数则删除vector尾部的元素。resize()函数可以改变...
调用vector容器对象的insert()函数在容器对象的第1个位置上插入一个整型值,再调用copy算法把vector容器对象中的所有元素复制到list容器对象中,最后输出list容器对象中的所有元素。 知识点: 1. STL(Standard ...
函数对象(Function Object)是C++ STL中的一个概念,用于封装函数的调用。函数对象可以作为算法的参数,实现更加灵活地操作。下面是函数对象的使用示例: ```cpp class even_by_two { public: int operator()() ...
总结一下,C++的`std::vector`提供了`erase`函数,让我们能够方便地从容器中移除元素。理解`erase`函数的工作原理及其不同重载版本的用法,对于高效地管理`vector`中的数据至关重要。在处理动态数据集时,合理使用`...
- 在`std::vector`中,如果进行了重新分配内存的操作(例如调用`resize`使得容器容量改变),所有指向该容器的迭代器都将失效。 #### 二、解决方法 针对上述问题,可以采取不同的策略来处理迭代器失效的情况: 1...
10. `size()`函数可以回容器中实际数据的个数。 11. `begin()`函数可以返回指向容器第一个元素的迭代器。 12. `end()`函数可以返回指向容器最后一个元素的迭代器。 内存管理与效率 1. 使用`reserve()`函数可以提前...
- **迭代器访问**:通过`vector<T>::iterator it`定义迭代器,然后使用`for`循环遍历`vector`,例如`for(it=vec.begin(); it!=vec.end(); it++)`。 - **插入元素**:`vec.insert(iter, value)`在迭代器`iter`指向...
为了在C语言中实现类似STL(Standard Template Library)的`vector`功能,我们需要自定义一个数据结构,并提供相应的操作函数来模拟动态数组的行为。 在`vector.c`和`vector.h`这两个文件中,开发者可能已经创建了...
本文将详细介绍 C++ 中 vector 的用法、函数调用和内存管理机制。 vector 的用法 1. 文件包含:在程序开头处加上 `#include <vector>` 以包含 vector 头文件,并加上 `using namespace std;` 以使用标准命名空间。...
C++中vector的用法详解 vector是C++中的一种动态数组,相当于一个类,允许程序员在不知道数组规模的情况下动态地添加或删除元素,以达到最大节约空间的目的。 文件包含 在使用vector之前,需要在程序开头处加上`#...
3. 具体的用法以及函数调用:可以使用 `push_back` 函数在数组的最后添加一个数据;使用 `at` 函数得到编号位置的数据;使用 `begin` 函数得到数组头的指针;使用 `end` 函数得到数组的最后一个单元+1 的指针;使用 ...
当我们调用`erase`成员函数时,会从容器中移除指定元素。对于`vector`和`list`,处理方式有所不同: 1. **对于`vector`**,`erase`函数接受一个迭代器作为参数,它会删除迭代器所指向的元素,并返回一个新的迭代器...
C++中的`std::vector`是一个非常重要的容器,它提供了动态数组的功能,允许我们在运行时改变其大小。在本文中,我们将深入探讨`vector`的基本用法、操作以及一些高级特性。 首先,`vector`的存入和输出是通过`push_...
在C++编程语言中,`std::vector`是一种非常常用且强大的容器,它能够自动管理内存,提供连续的存储空间,并支持随机访问等特性。然而,在某些情况下,我们需要手动管理`vector`中的对象以释放不再使用的资源,尤其是...
在C++编程中,容器和算法是两个核心概念,它们是标准模板库(STL)的重要组成部分。容器是用于存储数据的类,而算法则是处理这些数据的操作。以下是对这两个主题的一些关键知识点的详细说明。 **1. 容器:set和map...
当在`vector`或`deque`容器中插入元素时,程序需要确保迭代器在每次循环后都得到更新。这是因为插入操作可能导致迭代器失效。此外,不要存储`end`操作返回的迭代器,因为添加或删除容器内的元素可能会导致存储的迭代...