STL 小白学习(3) vector

  1 #include <iostream>
  2 using namespace std;
  3 #include <vector>
  4 
  5 void printVector(vector<int>& v) {
  6     for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
  7         cout << (*it) << " ";
  8     }
  9     cout << endl;
 10 }
 11 //初始化
 12 void test01() {
 13 
 14     vector<int> v1;//默认构造 初始化
 15     //用数组进行初始化
 16     int arr[] = { 10,30,45,65 };
 17     vector<int> v2(arr, arr + sizeof(arr) / sizeof(int));
 18     //用迭代器进行初始化
 19     vector<int>v3(v2.begin(), v2.end());
 20     //,,,
 21     vector<int>v4(v3);
 22 
 23     //遍历
 24     printVector(v2);
 25     printVector(v3);
 26     printVector(v4);
 27 
 28 }
 29 
 30 //常用赋值操作
 31 void test02() {
 32     vector<int> v = { 45,4,54,56,10 }; 
 33     printVector(v);
 34     vector<int> v2;
 35     v2.assign(v.begin(), v.end()); //.assign()成员函数赋值
 36     printVector(v2);
 37     vector<int> v3;
 38     v3 = v2;//等号重载 赋值
 39     printVector(v3);
 40     vector<int> _v = { 123,123,323,44,20 };
 41     _v.swap(v);//将_v与v数据交换
 42     printVector(_v);
 43     printVector(v);
 44 }
 45 
 46 //大小操作 
 47 //.size()  .resize() .capacity()
 48 void test03() {
 49     vector<int> v1 = { 120,540,4,54,89 };
 50 
 51     cout << "size :" << v1.size() << endl;//.size()访问元素个数
 52 
 53     if (v1.empty()) {//.empty()判断对象是否为空 空返回真
 54         cout << "v1为空" << endl;
 55     }
 56     else {
 57         cout << "v1不为空" << endl;
 58     }
 59     //修改容器大小.resize()
 60     printVector(v1);
 61     v1.resize(2);//修改容器大小为2
 62     printVector(v1);//超出范围的元素被删除 
 63     v1.resize(6);//修改容器大小为6 原有元素个数<修改后的个数 默认添加0
 64     printVector(v1);
 65     v1.resize(9,1);//修改容器大小为9 原有元素个数<修改后的个数 将默认添加0改为1
 66     printVector(v1);
 67 
 68     cout <<"容量 : " <<v1.capacity() << endl;//.capacity()显示容量
 69     
 70     //size可以不等于capacity
 71     for (int i = 0; i < 100000; i++) {
 72         v1.push_back(1);
 73     }
 74     cout << "size : " << v1.size() << endl;//显示容器大小
 75     cout << "容量 : " << v1.capacity() << endl;//显示容量
 76     //size不等于capacity
 77     
 78 }
 79 
 80 //vector 存取数据 .at()
 81 void test04() {
 82     vector<int> v1 = { 156,4,4,5641,654,684 };
 83 
 84     //[]重载 存取数据
 85     for (int i = 0; i < v1.size(); i++) {
 86         cout << v1[i] << " ";
 87     }
 88     cout << endl;
 89 
 90     //成员函数.at() 存取数据
 91     for (int i = 0; i < v1.size(); i++) {
 92         cout << v1.at(i) << " ";
 93     }
 94     cout << endl;
 95 
 96     //区别 at()会抛出异常
 97     try {
 98         cout << v1.at(100);
 99     }
100     catch (...) {
101         cout << "接到异常!" << endl;
102     }
103 
104 }
105 //数据存储操作 .front()  .back()
106 void test05() {
107     vector<int> v1 = { 156,4,4,5641,654,684 };
108     cout << "v1的第一个元素为:" << v1.front() << endl; //返回第一个元素值
109     cout << "v1的最后一个元素为:" << v1.back() << endl;//返回最后一个元素值
110 }
111 
112 //插入删除 .insert() .push_back() .pop_back() .clear()
113 void test06(){
114     vector<int> v1 = { 156,4,4,5641,654,684 };
115     //尾部添加 545
116     v1.push_back(545);    
117     v1.push_back(1);//尾部添加 1
118     //尾部删除
119     v1.pop_back();
120     //在头部插入30
121     v1.insert(v1.begin(), 30);
122     //在尾部部插入30
123     v1.insert(v1.end(), 30);
124     //将30插入到v1[5]的位置
125     v1.insert(v1.begin() + 5, 30);
126     printVector(v1);
127     //vector 随即访问
128     //支持数组下标,一般支持随机访问
129     //迭代器可以直接进行 +1,+2,+3的操作 
130 
131     v1 = { 84,8948,94,8948,94,89,2323,489,48,94 };
132     printVector(v1);
133     //删除第一个元素
134     v1.erase(v1.begin());
135     printVector(v1);
136     //删除v1[5]元素
137     v1.erase(v1.begin()+5);
138     printVector(v1);
139     //删除最后一个元素
140     v1.erase(v1.end() -1);
141     printVector(v1);
142     //删除v1[2]到v1[3]的元素
143     v1.erase(v1.begin()+1, v1.begin() + 3);
144     printVector(v1);
145     //清除所有元素
146     v1.clear();
147     printVector(v1);
148 }
149 //用swap收缩空间
150 void test07() {
151     vector<int> v;
152     for (int i = 0; i < 100000; i++) {
153         v.push_back(1);
154     }
155     cout << "size: " << v.size() << endl;
156     cout << "capacity: " << v.capacity() << endl;
157 
158     v.resize(10);
159     cout << "size: " << v.size() << endl;
160     cout << "capacity: " << v.capacity() << endl;
161 
162     //收缩capacity    
163     //vector<int>(v) 用v初始化匿名对象* 
164     //swap 交换指针指向 将v空间指向匿名对象的空间
165     //匿名对象析构 结束
166     vector<int>(v).swap(v);
167     cout << "size: " << v.size() << endl;
168     cout << "capacity: " << v.capacity() << endl;
169 }
170 
171 //reserve 和 resize函数的区别
172 //reserve 预留空间
173 //resize  修改大小
174 void test08() {
175     int num = 0;
176     int* addr = NULL;
177 
178     vector<int> v;
179     v.reserve(100000);//预留空间 减少拷贝次数
180     for (int i = 0; i < 10000; i++) {
181         v.push_back(i);
182         if (addr != &(v[0])) { //计算有多少次空间的申请与释放
183             addr = &(v[0]);
184             num++;
185         }
186     }
187     cout << "num:" << num<<endl;
188 }
189 
190 
191 int main() {
192     test08();
193 }
原文地址:https://www.cnblogs.com/likeghee/p/10170318.html