STL 容器和迭代器连载5_顺序容器的操作2

11 篇文章 0 订阅
/*- ==========================================================
*     文件名  :STL_con_ite_5.cpp
*     开发人员:袁培荣
*     当前版本:1.0.0.2595
*     创建时间:2012-05-23
*     修改时间:2012-05-23
*     功能说明:STL 容器和迭代器连载5_顺序容器的操作2
*     版权说明:版权所有 袁培荣 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[])
{
    //在STL vector 介绍连载1-2-3中,我们介绍了不能通过下标来添加元素,
    //又演示了用push_back(t)成员函数在vector末尾添加元素的方法
    //这里,我们来系统介绍向容器中添加元素的方法。
    
    //先定义三个容器:
    vector<int> v1(7,0);
    vector<int> v2(10,1);
    list<int> l1(5,2);
    
    //第一种方法:
    //push_back(t)成员函数在容器的末尾添加元素,返回类型为void
    v1.push_back(20);//在v1的末尾加入一个元素,值为20;
    //验证:
    cout<<"第一种方法:"<<endl;
    cout<<"现在v1.size()="<<v1.size()<<endl;
    cout<<"现在v1的末尾元素值为:"<<*(v1.end()-1)<<endl; //我们要习惯于用迭代器
    
    //第二种方法:
    //push_front(t)成员函数在容器的前端添加元素,返回类型为void
    //值得注意的是,这种方法只能用于list和deque容器
    l1.push_front(30);//在l1的前端加入一个元素,值为20;
    //验证:
    cout<<"第二种方法:"<<endl;
    cout<<"现在l1.size()="<<l1.size()<<endl;
    cout<<"现在l1的前端元素值为:"<<*l1.begin()<<endl; 
    
    //以上方法都不能在容器任意位置添加元素
    //要实现在容器任意位置添加元素,就是用到insert成员函数
    //insert成员函数有三个重载版本,我们一一介绍
    
    //第三种方法:
    //利用insert(p,t)重载成员函数
    //p是一个指向容器元素的迭代器,在这个元素的前面插入值为t的元素
    //返回一个迭代器,指向新插入的元素。
    //在v1的第三个元素前面插入50,
    //v1.begin()+2 是一个迭代器,指向插入前v1的第3个元素
    //新插入的元素就是新的v1的第三个元素,就是v1[2]
    vector<int>::iterator iter1=v1.insert(v1.begin()+2, 50);
    //验证:
    cout<<"第三种方法:"<<endl;
    cout<<"现在v1.size()="<<v1.size()<<endl;
    cout<<"现在v1的第3个元素值是(方法1输出):"<<*iter1<<endl;
    cout<<"现在v1的第3个元素值是(方法2输出):"<<v1[2]<<endl;
    
    //第四种方法:
    //利用insert(p,n,t)重载成员函数,实现一次插入多个相同的元素
    //p是一个指向容器元素的迭代器,在这个元素的前面插入n个值为t的元素
    //返回void类型。
    v1.insert(v1.begin()+2, 3, 60);
    //验证:
    cout<<"第四种方法:"<<endl;
    cout<<"现在v1.size()="<<v1.size()<<endl;
    cout<<"现在v1的第3个元素值是:"<<v1[2]<<endl;
    cout<<"现在v1的第4个元素值是:"<<v1[3]<<endl;
    cout<<"现在v1的第5个元素值是:"<<v1[4]<<endl;
    
    //第五种方法:
    //利用insert(p,b,e)重载成员函数,实现一次插入多个任意元素
    //p是一个指向容器元素的迭代器
    //b,e是分别指向另一个容器中两个不同或者相同的元素的迭代器
    //在p所指向的元素前面插入b到e左闭合区间内指向的元素
    //返回void类型。
    //为便于区分先调整v2中的第7,8,9三个元素的值
    v2[6]=6;
    v2[7]=7;
    v2[8]=8;
    //把这三个元素插入到v1的第3个元素前面
    v1.insert(v1.begin()+2, v2.begin()+6, v2.begin()+9);
    //注意,插入区间为[v2.begin()+6, v2.begin()+9) 
    //即[v2[6],v2[9]) 即插入v2[6],v2[7],v2[8]三个元素
    //左闭合区间的含义告诉我们v2[9]不会被插入
    //验证:
    cout<<"第五种方法:"<<endl;
    cout<<"现在v1.size()="<<v1.size()<<endl;
    cout<<"现在v1的第3个元素值是:"<<v1[2]<<endl;
    cout<<"现在v1的第4个元素值是:"<<v1[3]<<endl;
    cout<<"现在v1的第5个元素值是:"<<v1[4]<<endl;
    //还是要强调,左闭合区间的含义是一个重点。
    
	//虽然第二种方法push_front(t)只支持list和deque容器
	//但我们用第三种方法的一个特例就能和做到第二种方法同样的效果:
	//例如:
	v1.insert(v1.begin(), 100); 
	//第三种方法虽然有返回值,但我们不接收这个返回值是可以的
	//验证:
    cout<<"用第三种方法的特例实现第二种方法:"<<endl;
    cout<<"现在v1.size()="<<v1.size()<<endl;
    cout<<"现在v1的前端元素值为:"<<*v1.begin()<<endl; 
	//这样,我们可以为不支持第二种方法的容器扩展这一种方法
	
    return 0;
}


//============================
//运行结果:
//============================
// 第一种方法:
// 现在v1.size()=8
// 现在v1的末尾元素值为:20
// 第二种方法:
// 现在l1.size()=6
// 现在l1的前端元素值为:30
// 第三种方法:
// 现在v1.size()=9
// 现在v1的第3个元素值是(方法1输出):50
// 现在v1的第3个元素值是(方法2输出):50
// 第四种方法:
// 现在v1.size()=12
// 现在v1的第3个元素值是:60
// 现在v1的第4个元素值是:60
// 现在v1的第5个元素值是:60
// 第五种方法:
// 现在v1.size()=15
// 现在v1的第3个元素值是:6
// 现在v1的第4个元素值是:7
// 现在v1的第5个元素值是:8
// 用第三种方法的特例实现第二种方法:
// 现在v1.size()=16
// 现在v1的前端元素值为:100
//============================


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值