关于STL中vector容器的学习,编译运行后边看代码,边看执行结果效果更佳,还是想说看别人的代码一百遍,不如自己动手写一遍。
vector向量容器不但能像数组一样对元素进行随机访问,还能随时在尾部插入元素,简单而高效,能够完全替代数组。
vector最大的亮点在于具有内存自动管理的功能,插入和删除元素时能够动态调整所占的内存空间。
值得注意的是,vector容器中的两个重要方法,begin()返回的是首元素位置的迭代器,end()返回的是最后一个元素的下一个元素位置的迭代器。
1 //关于STL中vector容器的学习,编译运行后边看代码,边看执行结果效果更佳,不过看别人的代码一百遍,不如自己动手写一遍 2 #include <vector>//头文件 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 void print(vector <int> v); 8 bool mycmpare(const int &a, const int &b){ 9 return a>b; 10 } 11 int main () 12 { 13 //创建vector对象三种常用的方式,此处存储元素类型是int,还可以是double、char、long long等基本数据类型,甚至是string基本字符序列容器 14 vector <int> v1;//不指定容器的元素个数的定义一个用来存储整型的向量容器 15 cout<<"v1:"<<endl; 16 print(v1); 17 /*运行结果 18 v1: 19 大小为:0 20 */ 21 22 vector <int> v2(5);//指定容器的元素个数的定义一个大小为10的用来存储整型的向量容器,默认初始化为0 23 cout<<"v2:"<<endl; 24 print(v2); 25 /*运行结果 26 v2: 27 大小为:5 28 0 0 0 0 0 29 */ 30 31 vector <int> v3(5,1);//也可指定初始值,此处指定为1 32 cout<<"v3:"<<endl; 33 print(v3); 34 /*运行结果 35 v3: 36 大小为:5 37 1 1 1 1 1 38 */ 39 40 //另外事先指定不指定大小都无所谓,指定了大小也可以随时使用push_back()对vector容器进行尾部扩张 41 v1.push_back(1);//向空的vector容器尾部扩张,追加元素为1 42 cout<<"v1:"<<endl; 43 print(v1); 44 v3.push_back(2);//向已有元素的vector容器尾部扩张,追加元素为2 45 cout<<"v3:"<<endl; 46 print(v3); 47 /*运行结果 48 v1: 49 大小为:1 50 1 51 52 v3: 53 大小为:6 54 1 1 1 1 1 2 55 */ 56 57 //插入元素使用insert()方法,要求插入的位置是迭代器的位置,而不是元素的下标 58 v3.insert(v3.begin(),3);//在最前面插入3 59 cout<<"v3:"<<endl; 60 print(v3); 61 62 v3.insert(v3.end(),3);//在末尾追加3,此处等同于push_back() 63 cout<<"v3:"<<endl; 64 print(v3); 65 /*运行结果 66 v3: 67 大小为:7 68 3 1 1 1 1 1 2 69 70 v3: 71 大小为:8 72 3 1 1 1 1 1 2 3 73 */ 74 75 int i; 76 for(i=0;i < v3.size();i++){//只可赋值到已扩张位置 77 v3[i]=i; 78 } 79 //要删除一个元素或者一个区间中的所有元素时使用erase()方法 80 v3.erase(v3.begin()+2);//删除第2个元素,从0开始计数 81 cout<<"v3:"<<endl; 82 print(v3); 83 /*运行结果 84 v3: 85 大小为:7 86 0 1 3 4 5 6 7 87 */ 88 v3.erase(v3.begin()+1,v3.begin()+3);//删除第1个到第3个元素区间的所有元素 89 cout<<"v3:"<<endl; 90 print(v3); 91 /*运行结果 92 v3: 93 大小为:5 94 0 4 5 6 7 95 */ 96 //由结果可知,erase()方法同insert()方法一样,操作的位置都只是迭代器的位置,而不是元素的下标 97 98 //要想清空vector(),使用clear()方法一次性删除vector中的所有元素 99 cout<<"v2:"<<endl; 100 print(v2); 101 /*运行结果 102 v2: 103 大小为:5 104 0 0 0 0 0 105 */ 106 v2.clear(); 107 if(v2.empty()) cout<<"v2经过使用clear()方法后为空\n"; 108 print(v2); 109 /*运行结果 110 v2经过使用clear()方法后为空 111 大小为:0 112 */ 113 114 //要想将向量中某段迭代器区间元素反向排列,则使用reverse()反向排列算法,需要添加algorithm头文件 115 cout<<"v3反向排列前:"<<endl; 116 print(v3); 117 reverse(v3.begin(),v3.end());//全部反向排列 118 cout<<"v3反向排列后:"<<endl; 119 print(v3); 120 /*运行结果 121 v3反向排列前: 122 大小为:5 123 0 4 5 6 7 124 125 v3反向排列后: 126 大小为:5 127 7 6 5 4 0 128 */ 129 130 //要想将向量中某段迭代器区间元素进行排序,则使用sort()算法 131 cout<<"v3升序排列前:"<<endl; 132 print(v3); 133 sort(v3.begin(),v3.end());//默认升序排列 134 cout<<"v3升序排列后:"<<endl; 135 print(v3); 136 /*运行结果 137 v3升序排列前: 138 大小为:5 139 7 6 5 4 0 140 141 v3升序排列后: 142 大小为:5 143 0 4 5 6 7 144 */ 145 146 //自定义排序比较函数,此处降序 147 cout<<"v3降序排列前:"<<endl; 148 print(v3); 149 sort(v3.begin(),v3.end(),mycmpare); 150 cout<<"v3降序排列后:"<<endl; 151 print(v3); 152 /*运行结果 153 v3降序排列前: 154 大小为:5 155 0 4 5 6 7 156 157 v3降序排列后: 158 大小为:5 159 7 6 5 4 0 160 */ 161 } 162 163 void print(vector <int> v) 164 { 165 //cout<<"下标方式访问:"<<endl; 166 cout<<"大小为:"<<v.size()<<endl; 167 int i; 168 for(i=0;i< v.size();i++){ 169 cout<<v[i]<<‘ ‘; 170 } 171 cout<<endl<<endl; 172 173 /*cout<<"用迭代器访问:"<<endl; 174 //定义迭代器变量it,类型与容器元素类型保持一致 175 vector<int>::iterator it; 176 for(it=v.begin(); it != v.end(); it++){ 177 cout<<*it<<‘ ‘; 178 } 179 cout<<endl<<endl;*/ 180 }