std中vector和list容器遍历时元素的动态删除

问题描述如下:

在容器遍历过程中怎样动态地删除满足条件的元素,而不影响容器本次的遍历过程

代码:

#include "stdafx.h"
#include <list>
#include <vector>
#include <iostream>
using namespace std;  

void main()
{
    list<int> l;
	for(int i=0;i<10;i++)						//存储1~10的元素值
	{
		l.push_back(i+1);
	}

	list<int>::iterator it=l.begin();
	while(it!=l.end())
	{
		list<int>::iterator lsave;
		if(*it%2==0)						//删除偶数元素
		{
			lsave=it;
			it++;
			l.erase(lsave);
		}
		else
		{
			it++;
		}
	}
	it=l.begin();
	while(it!=l.end())						//遍历该list
	{
		cout<<*it<<" ";
		it++;
	}

	//**********************************
	cout<<endl<<"*******************"<<endl;
	vector<int> vec;
	for(int i=0;i<10;i++)
	{
		vec.push_back(i+1);
	}
	vector<int>::iterator it1=vec.begin();
	for(int i=0;i<vec.size();i++)
	{
		if(vec[i]%3==0)
		{
			vec.erase(i+it1);
		}
	}
	it1=vec.begin();
	while(it1!=vec.end())
	{
		cout<<*it1<<" ";
		it1++;
	}
	cout<<endl;

	system("pause");
}  

时间: 2024-10-11 22:25:15

std中vector和list容器遍历时元素的动态删除的相关文章

STL容器遍历时删除元素

STL容器遍历时在循环体内删除元素最容易出错了,根本原因都是因为迭代器有效性问题,在此记下通用删除方法,该方法适用于所有容器: 1 std::vector<int> myvec; 2 3 std::vector<int>::iterator it = myvec.begin(); 4 while( it != myvec.end()) 5 { 6 it = myvec.erase(it); 7 } 容器list有个比较另类的删除方法,如下代码所示: std::list<int

std中vector的实现原理(标准模板动态库中矢量的实现原理)

我们实现的数据结构是为了解决在运行过程中动态的开辟空间使用(例如我们不停的输入,输入的多少我们不确定) 原理两种: 一.笨办法 我们第一次用多少空间,开辟多少空间A 我们第二次用空间,会开辟大于第一次开辟的空间B,将A里的数据拷贝到B中,然后释放A,在C中写入新的数据 缺点:在于拷贝的次数太多,效率低 二.改进的办法 矢量有一个参数,里面填写预留的空间,加入我们填写的预留空间大小是B,这里是预留,并没有真正的开辟物理内存,预留的作用于如果这时候如果需要开辟空间做其他事情,开辟的空间会避开B,这样

C++ STL中vector(向量容器)使用简单介绍

原文:http://www.seacha.com/article.php/knowledge/cbase/2013/0903/2205.html C++ vector(向量容器)是一个线性顺序结构.相当于数组,但其大小可以不预先指定,并且自动扩展.它可以像数组一样被操作,由于它的特性我们完全可以将vector 看作动态数组,或者作为动态内存. 在创建一个vector 后,它会自动在内存中分配一块连续的内存空间进行数据存储,初始的空间大小可以预先指定也可以由vector 默认指定,这个大小即cap

C++晋升之std中vector的实现原理(标准模板动态库中矢量的实现原理)

我们实现的数据结构是为了解决在执行过程中动态的开辟空间使用(比如我们不停的输入,输入的多少我们不确定) 假设当你看到这篇文章的话,就当作是零食咀嚼,营养没有有BUG,能够直接看我博客中文章:CPU对内存的管理,进一步和一些改正的理解 原理两种: 一.笨办法 我们第一次用多少空间,开辟多少空间A 我们第二次用空间,会开辟大于第一次开辟的空间B,将A里的数据复制到B中,然后释放A.在C中写入新的数据 缺点:在于拷贝的次数太多,效率低 二.改进的办法 矢量有一个參数,里面填写预留的空间,增加我们填写的

算法Sedgewick第四版-第1章基础-021一双向链表,在遍历时可修改、删除元素

1 package algorithms.ADT; 2 3 /****************************************************************************** 4 * Compilation: javac DoublyLinkedList.java 5 * Execution: java DoublyLinkedList 6 * Dependencies: StdOut.java 7 * 8 * A list implemented w

C++中 vector(容器)的用法

vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的. 用法: 1.文件包含: 首先在程序开头处加上#include<vector>以包含所需要的类文件vector 还有一定要加上using namespace std; 2.变量声明: 2.1 例:声明一个int向量以替代一维的数组:vector <int> a;(等于声明了一个int数组a[],大小没有指定,

std::vector&lt;Channel2*&gt; m_allChannels;容器,以及如何根据channelid的意义

std::vector<Channel2*> m_allChannels;容器,以及如何根据channelid的意义 这个容器保存了所有客户端连接的channel Channel2* LibEvtServer::CreateChannel(bufferevent* be) { auto c2 = new Channel2; c2->ser = this; auto c = new Channel(be);//这个be比较重要,be是基于socket的bufferevent,包含socke

采用Spring实现在容器启动时把用ConcurrentHashMap实现的并发缓存加载到ServletContext中

1.ConstantDataDTO.java,一定要重写hashcode和equals方法 import java.io.Serializable; import java.util.Date; /** * ConstantDataDTO.java * * @author steveguoshao * @created 2014年07月10日 下午6:15:55 * @version 1.0 */ public class ConstantDataDTO implements Serializa

C/C++知识要点2——STL中Vector、Map、Set容器的实现原理

1.Vector是顺序容器,是一个动态数组,支持随机存取.插入.删除.查找等操作,在内存中是一块连续的空间.在原有空间不够情况下自动分配空间,增加为原来的两倍.vector随机存取效率高,但是在vector插入元素,需要移动的数目多,效率低下. 注意:vector动态增加大小时,并不是在原空间之后持续新空间(因为无法保证原空间之后尚有可供配置的空间),而是以原大小的两倍另外配置一块较大的空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间.因此,对vector的任何操作,一