STL 容器和迭代器连载6_顺序容器的操作3

11 篇文章 0 订阅
/*- ==========================================================
*     文件名  :STL_con_ite_6.cpp
*     开发人员:袁培荣
*     当前版本:1.0.0.2595
*     创建时间:2012-05-24
*     修改时间:2012-05-24
*     功能说明:STL 容器和迭代器连载6_顺序容器的操作3
*     版权说明:版权所有 袁培荣 YuanPeirong 
*     编译环境:Windows 7(x64) SP1 简体中文专业版
*     编译器:  Visual Studio 2010 SP1(中文旗舰版)
                MinGW 20120426 GNU GCC 4.6.2
                Visual C++ 6.0 SP6(中文企业版)
- ==========================================================*/

#include <iostream>
#include <vector>
#include <list>
#include <deque>
#include <string>

using std::cout;
using std::endl;
using std::vector;
using std::list;
using std::deque;
using std::string;

int main(int argc, char* argv[])
{
    //下面来介绍删除容器内元素的相关操作
	
	//先定义一个容器,并添加101个元素。
	vector<int> v1;
	for(int i=0; i!=101; i++) //C++程序员习惯于用i!=101,而不是i<101
	    v1.push_back(i);
	cout<<"在所有删除操作前v1.size()="<<v1.size()<<endl;
	
	//第一种方法:
	//erase(p) :删除迭代器p所指向的元素
	//返回指向被删除元素的下一位置的迭代器。
	//注意:p必须真实地指向实际存在的元素。
	cout<<"第一种方法:"<<endl;
    cout<<"删除前v1的第96个元素值是(方法1输出):"<<*(v1.begin()+95)<<endl;
    cout<<"删除前v1的第96个元素值是(方法2输出):"<<v1[95]<<endl;
	//我们把第96个元素删除
	vector<int>::iterator iter1=v1.erase(v1.begin()+95);
	//验证:
    cout<<"删除后v1.size()="<<v1.size()<<endl;
    cout<<"删除后v1的第96个元素值是(方法1输出):"<<*iter1<<endl;
    cout<<"删除后v1的第96个元素值是(方法2输出):"<<v1[95]<<endl;
	
	//第二种方法:
	//erase(b,e) :删除迭代器b,e所指向的元素形成的左闭合区间
	//返回指向被删除的最后一个元素的下一位置的迭代器。
	cout<<"第二种方法:"<<endl;
    cout<<"删除前v1的第81个元素值是:"<<*(v1.begin()+80)<<endl;
	cout<<"删除前v1的第82个元素值是:"<<*(v1.begin()+81)<<endl;
	cout<<"删除前v1的第83个元素值是:"<<*(v1.begin()+82)<<endl;
	//我们把第81,82,83三个元素删除
	iter1=v1.erase(v1.begin()+80, v1.begin()+83);
	//验证:
    cout<<"删除后v1.size()="<<v1.size()<<endl;
	cout<<"删除后v1的第81个元素值是(方法1输出):"<<*iter1<<endl;
    cout<<"删除后v1的第81个元素值是(方法2输出):"<<*(v1.begin()+80)<<endl;
	cout<<"删除后v1的第82个元素值是:"<<*(v1.begin()+81)<<endl;
	cout<<"删除后v1的第83个元素值是:"<<*(v1.begin()+82)<<endl;
	
	//第三种方法:
	//pop_back() 删除容器的最后一个元素,返回void类型
	cout<<"第三种方法:"<<endl;
	cout<<"删除前v1的最后一个元素值是:"<<*(v1.end()-1)<<endl;
	if(v1.size()!=0)    //防止容器为空时,删除操作引发错误
	    v1.pop_back();
	//验证:
    cout<<"删除后v1.size()="<<v1.size()<<endl;
	cout<<"删除后v1的最后一个元素值是:"<<*(v1.end()-1)<<endl;
	
	//第四种方法:
	//pop_front() 删除容器的第一个元素,返回void类型
	//值得注意的是,这种方法只能用于list和deque容器
	list<int> l1(3,0);
	*l1.begin()=0;      //为便于区分元素,将各修改成不相同
	//下面指出修改list容器的元素时的两种错误
	//l1[1]=1;           //list容器不支持l1[0]这样的下标访问(下面会讲)
	//*(l1.begin()+2)=2; //list容器的迭代器不能与数值相加(复习一下前面)
	list<int>::iterator iter2=l1.begin();
	iter2++;             //迭代器的++操作是对所有容器都支持的
	*(iter2)=1;
	iter2++;
	*(iter2)=2;
	cout<<"第四种方法:"<<endl;
    cout<<"删除前l1.size()="<<l1.size()<<endl;
	cout<<"删除前l1的第一个元素值是:"<<*l1.begin()<<endl;
	if(!l1.empty())     //防止容器为空时,删除操作引发错误
	    l1.pop_front(); //empty()用来判断容器是否为空,下面会讲
	//验证:
    cout<<"删除后l1.size()="<<l1.size()<<endl;
	cout<<"删除后l1的第一个元素值是:"<<*l1.begin()<<endl;
	
    //虽然第四种方法pop_front(t)只支持list和deque容器
	//但我们用第一种方法的一个特例就能和做到第二种方法同样的效果:
	//例如:
	cout<<"用第一种方法的特例实现第四种方法:"<<endl;
    cout<<"删除前v1.size()="<<v1.size()<<endl;
	cout<<"删除前v1的第一个元素值是:"<<*v1.begin()<<endl;
	v1.erase(v1.begin());
	//验证:
    cout<<"删除后v1.size()="<<v1.size()<<endl;
	cout<<"删除后v1的第一个元素值是:"<<*v1.begin()<<endl;
	//这样,我们可以为不支持第四种方法的容器扩展这一种方法
	
	//第五种方法:
	//clear() 删除容器内的所有元素,返回void类型
	cout<<"第五种方法:"<<endl;
	cout<<"清空前v1.size()="<<v1.size()<<endl;
	cout<<"清空前l1.size()="<<l1.size()<<endl;
	//清空v1和l1
	v1.clear();
	l1.clear();
	//验证:
	cout<<"清空后v1.size()="<<v1.size()<<endl;
	cout<<"清空后l1.size()="<<l1.size()<<endl;
	
	
	
    return 0;
}


//============================
//运行结果:
//============================
// 在所有删除操作前v1.size()=101
// 第一种方法:
// 删除前v1的第96个元素值是(方法1输出):95
// 删除前v1的第96个元素值是(方法2输出):95
// 删除后v1.size()=100
// 删除后v1的第96个元素值是(方法1输出):96
// 删除后v1的第96个元素值是(方法2输出):96
// 第二种方法:
// 删除前v1的第81个元素值是:80
// 删除前v1的第82个元素值是:81
// 删除前v1的第83个元素值是:82
// 删除后v1.size()=97
// 删除后v1的第81个元素值是(方法1输出):83
// 删除后v1的第81个元素值是(方法2输出):83
// 删除后v1的第82个元素值是:84
// 删除后v1的第83个元素值是:85
// 第三种方法:
// 删除前v1的最后一个元素值是:100
// 删除后v1.size()=96
// 删除后v1的最后一个元素值是:99
// 第四种方法:
// 删除前l1.size()=3
// 删除前l1的第一个元素值是:0
// 删除后l1.size()=2
// 删除后l1的第一个元素值是:1
// 用第一种方法的特例实现第四种方法:
// 删除前v1.size()=96
// 删除前v1的第一个元素值是:0
// 删除后v1.size()=95
// 删除后v1的第一个元素值是:1
// 第五种方法:
// 清空前v1.size()=95
// 清空前l1.size()=2
// 清空后v1.size()=0
// 清空后l1.size()=0
//============================


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值