001 | /*- ========================================================== |
002 | * 文件名 :STL_con_ite_5.cpp |
003 | * 开发人员:袁培荣 |
004 | * 当前版本:1.0.0.2595 |
005 | * 创建时间:2012-05-23 |
006 | * 修改时间:2012-05-23 |
007 | * 功能说明:STL 容器和迭代器连载5_顺序容器的操作2 |
008 | * 版权说明:版权所有 袁培荣 YuanPeirong |
009 | * 编译环境:Windows 7(x64) SP1 简体中文专业版 |
010 | * 编译器: Visual Studio 2010 SP1(中文旗舰版) |
011 | MinGW 20120426 GNU GCC 4.6.2 |
012 | Visual C++ 6.0 SP6(中文企业版) |
013 | - ==========================================================*/ |
014 |
015 | #include <iostream> |
016 | #include <vector> |
017 | #include <list> |
018 | #include <deque> |
019 | #include <string> |
020 |
021 | using std::cout; |
022 | using std::endl; |
023 | using std::vector; |
024 | using std::list; |
025 | using std::deque; |
026 | using std::string; |
027 |
028 | int main( int argc, char * argv[]) |
029 | { |
030 | //在STL vector 介绍连载1-2-3中,我们介绍了不能通过下标来添加元素, |
031 | //又演示了用push_back(t)成员函数在vector末尾添加元素的方法 |
032 | //这里,我们来系统介绍向容器中添加元素的方法。 |
033 | |
034 | //先定义三个容器: |
035 | vector< int > v1(7,0); |
036 | vector< int > v2(10,1); |
037 | list< int > l1(5,2); |
038 | |
039 | //第一种方法: |
040 | //push_back(t)成员函数在容器的末尾添加元素,返回类型为void |
041 | v1.push_back(20); //在v1的末尾加入一个元素,值为20; |
042 | //验证: |
043 | cout<< "第一种方法:" <<endl; |
044 | cout<< "现在v1.size()=" <<v1.size()<<endl; |
045 | cout<< "现在v1的末尾元素值为:" <<*(v1.end()-1)<<endl; //我们要习惯于用迭代器 |
046 | |
047 | //第二种方法: |
048 | //push_front(t)成员函数在容器的前端添加元素,返回类型为void |
049 | //值得注意的是,这种方法只能用于list和deque容器 |
050 | l1.push_front(30); //在l1的前端加入一个元素,值为20; |
051 | //验证: |
052 | cout<< "第二种方法:" <<endl; |
053 | cout<< "现在l1.size()=" <<l1.size()<<endl; |
054 | cout<< "现在l1的前端元素值为:" <<*l1.begin()<<endl; |
055 | |
056 | //以上方法都不能在容器任意位置添加元素 |
057 | //要实现在容器任意位置添加元素,就是用到insert成员函数 |
058 | //insert成员函数有三个重载版本,我们一一介绍 |
059 | |
060 | //第三种方法: |
061 | //利用insert(p,t)重载成员函数 |
062 | //p是一个指向容器元素的迭代器,在这个元素的前面插入值为t的元素 |
063 | //返回一个迭代器,指向新插入的元素。 |
064 | //在v1的第三个元素前面插入50, |
065 | //v1.begin()+2 是一个迭代器,指向插入前v1的第3个元素 |
066 | //新插入的元素就是新的v1的第三个元素,就是v1[2] |
067 | vector< int >::iterator iter1=v1.insert(v1.begin()+2, 50); |
068 | //验证: |
069 | cout<< "第三种方法:" <<endl; |
070 | cout<< "现在v1.size()=" <<v1.size()<<endl; |
071 | cout<< "现在v1的第3个元素值是(方法1输出):" <<*iter1<<endl; |
072 | cout<< "现在v1的第3个元素值是(方法2输出):" <<v1[2]<<endl; |
073 | |
074 | //第四种方法: |
075 | //利用insert(p,n,t)重载成员函数,实现一次插入多个相同的元素 |
076 | //p是一个指向容器元素的迭代器,在这个元素的前面插入n个值为t的元素 |
077 | //返回void类型。 |
078 | v1.insert(v1.begin()+2, 3, 60); |
079 | //验证: |
080 | cout<< "第四种方法:" <<endl; |
081 | cout<< "现在v1.size()=" <<v1.size()<<endl; |
082 | cout<< "现在v1的第3个元素值是:" <<v1[2]<<endl; |
083 | cout<< "现在v1的第4个元素值是:" <<v1[3]<<endl; |
084 | cout<< "现在v1的第5个元素值是:" <<v1[4]<<endl; |
085 | |
086 | //第五种方法: |
087 | //利用insert(p,b,e)重载成员函数,实现一次插入多个任意元素 |
088 | //p是一个指向容器元素的迭代器 |
089 | //b,e是分别指向另一个容器中两个不同或者相同的元素的迭代器 |
090 | //在p所指向的元素前面插入b到e左闭合区间内指向的元素 |
091 | //返回void类型。 |
092 | //为便于区分先调整v2中的第7,8,9三个元素的值 |
093 | v2[6]=6; |
094 | v2[7]=7; |
095 | v2[8]=8; |
096 | //把这三个元素插入到v1的第3个元素前面 |
097 | v1.insert(v1.begin()+2, v2.begin()+6, v2.begin()+9); |
098 | //注意,插入区间为[v2.begin()+6, v2.begin()+9) |
099 | //即[v2[6],v2[9]) 即插入v2[6],v2[7],v2[8]三个元素 |
100 | //左闭合区间的含义告诉我们v2[9]不会被插入 |
101 | //验证: |
102 | cout<< "第五种方法:" <<endl; |
103 | cout<< "现在v1.size()=" <<v1.size()<<endl; |
104 | cout<< "现在v1的第3个元素值是:" <<v1[2]<<endl; |
105 | cout<< "现在v1的第4个元素值是:" <<v1[3]<<endl; |
106 | cout<< "现在v1的第5个元素值是:" <<v1[4]<<endl; |
107 | //还是要强调,左闭合区间的含义是一个重点。 |
108 | |
109 | //虽然第二种方法push_front(t)只支持list和deque容器 |
110 | //但我们用第三种方法的一个特例就能和做到第二种方法同样的效果: |
111 | //例如: |
112 | v1.insert(v1.begin(), 100); |
113 | //第三种方法虽然有返回值,但我们不接收这个返回值是可以的 |
114 | //验证: |
115 | cout<< "用第三种方法的特例实现第二种方法:" <<endl; |
116 | cout<< "现在v1.size()=" <<v1.size()<<endl; |
117 | cout<< "现在v1的前端元素值为:" <<*v1.begin()<<endl; |
118 | //这样,我们可以为不支持第二种方法的容器扩展这一种方法 |
119 | |
120 | return 0; |
121 | } |
122 |
123 |
124 | //============================ |
125 | //运行结果: |
126 | //============================ |
127 | // 第一种方法: |
128 | // 现在v1.size()=8 |
129 | // 现在v1的末尾元素值为:20 |
130 | // 第二种方法: |
131 | // 现在l1.size()=6 |
132 | // 现在l1的前端元素值为:30 |
133 | // 第三种方法: |
134 | // 现在v1.size()=9 |
135 | // 现在v1的第3个元素值是(方法1输出):50 |
136 | // 现在v1的第3个元素值是(方法2输出):50 |
137 | // 第四种方法: |
138 | // 现在v1.size()=12 |
139 | // 现在v1的第3个元素值是:60 |
140 | // 现在v1的第4个元素值是:60 |
141 | // 现在v1的第5个元素值是:60 |
142 | // 第五种方法: |
143 | // 现在v1.size()=15 |
144 | // 现在v1的第3个元素值是:6 |
145 | // 现在v1的第4个元素值是:7 |
146 | // 现在v1的第5个元素值是:8 |
147 | // 用第三种方法的特例实现第二种方法: |
148 | // 现在v1.size()=16 |
149 | // 现在v1的前端元素值为:100 |
150 | //============================ |