C++ STL之vector用法總結
- 1.vector是可變大小陣列的序列容器
- 2.像陣列一樣,vector也採用連續儲存空間來儲存元素,就是說可以採用下標
- 對陣列進行訪問,大小可變,會被容器自動處理
- 3.本質講,vector使用動態分配陣列來儲存它的元素。
- 當新元素插入時候,這個陣列需要被重新分配大小為了增加儲存空間。
- 其做法是,分配一個新的陣列,然後將全部元素移到這個陣列。就時間而言,
- 這是一個相對代價高的任務,因為每當一個新的元素加入到容器的時候,
- vector並不會每次都重新分配大小。
- 4.與其它動態序列容器相比(deques, lists and forward_lists),
- vector在訪問元素的時候更加高效,在末尾新增和刪除元素相對高效。
- 對於其它不在末尾的刪除和插入操作,效率更低。
- 比起lists和forward_lists統一的迭代器和引用更好。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
//vector的宣告及初始化
1 vector<int> vec; //宣告一個int型向量
2 vector<int> vec1(5); //宣告一個初始大小為5的int向量
3 vector<int> vec2(10, 1); //宣告一個初始大小為10且值都為1的向量
4 vector<int> vec3(vec1); //宣告並用vec1向量初始化vec3向量
5 vector<int> tmp(vec2.begin(), vec2.begin() + 3); //用向量vec的第0個到第二個初始化tmp
6 int arr[5] = { 1,2,3,4,5 };
7 vector<int> vec4(arr, arr+5); //將arr陣列的元素用於初始化vec向量
8 //說明::::不包括arr[4]元素,末尾指標都是指結束元素的下一個元素
9 //為了和vec.end()指標統一
10 vector<int> vec5(arr, &arr[4]);
//vector基本操作
//1.容量
/*
向量大小:vec.size()
向量最大容量:vec.max_size()
更改向量大小: vec.resize()
向量真實大小: vec.cappcity()
向量判空: vec.empty()
減少向量大小到滿足元素所佔儲存空間的大小 : vec.shrink_to_fit();
*/
測試程式碼
1 void main() {
2 cout << vec4.size() << ends <<vec4.capacity() <<ends<<vec.max_size()<< endl;
3 cout << vec4.empty() << endl; //空為1,非空為0
4 cout << vec.empty() << endl;
5 vec.push_back(32);
6 for (int i = 0; i < 40; i++)
7 {
8 vec.push_back(i);
9 }
10 cout << vec.size() << ends << vec.capacity() << endl;
11 vec.shrink_to_fit();
12 cout << vec.capacity() << endl;
13 for(int i=0;i<vec4.size();i++)
14 cout << vec4[i] << endl;
15 for (int i = 0; i<vec5.size(); i++)
16 cout << vec5[i] << endl;
17 }
//2.修改
/*
多個元素賦值: vec.assign() //類似與初始化時用陣列賦值
末尾新增元素:vec.push_back()
末尾刪除元素 vec.pop_back()
任意位置插入元素 vec.insert()
任意位置刪除元素: vec.erase()
交換兩個向量元素 vec.swap()
清空向量元素 vec.clear()
*/
測試程式碼
1 int main() {
2 int i;
3 vec2=vec4; //vector可以直接用另一個賦值;
4 for (i = 0; i < vec2.size(); i++) {
5 cout << vec2[i] << endl;
6 }
7 cout << vec2.size() << ends << vec2.capacity() << endl;
8 //vector assign() 的三種用法
9 vec2.assign(3,7); //3個7
10 vec2.assign(arr, arr + 3); //迭代器 陣列名 0 1 2 不包括arr+3
11 vec2.assign({ 1,56,89 }); //無名陣列的方法進行賦值
12 //vector insert()函式的三種用法
13 vector<char> avector;
14 for (int i = 0; i < 10; i++) {
15 avector.push_back(i + 65);
16 }
17 avector.insert(avector.begin(), 5, `C`);// 1. 在指定loc 前插入val元素,返回指向這個元素的迭代器
18 avector.insert(avector.begin() + 2, 6); //2. 在指定位置loc前插入num個值為val的元素
19 avector.insert(avector.begin()+1,avector.begin(),avector.end()); //3.在指定位置loc前插入區間(start,end) 的所有元素
20 vector<char>::iterator it = avector.begin();
21 for (; it != avector.end(); it++) {
22 cout << *it << ends;
23 }
24 cout << endl;
25
26 //vector erase()函式的用法
27 //earse的返回值是返回被刪除元素向後的一個元素
28 //vector中erase的作用是刪除掉某個位置position或一段區域
29 //(begin, end)中的元素,減少其size。
30 for (it = avector.begin(); it != avector.end();) {
31 it = avector.erase(it);
32 }
33 for (; it != avector.end(); it++) {
34 cout << *it << ends;
35 }
36 cout << endl;
37 //vector swap()用法
38 cout << tmp.size() << ends << tmp.capacity() << endl;
39 tmp.erase(tmp.begin()+1);
40 cout << tmp.size() << ends << tmp.capacity() << endl;
41 tmp.swap(vec);
42 cout << tmp.size() << ends << tmp.capacity() << endl;
43 for (i = 0; i < vec2.size(); i++) {
44 cout << vec2[i] << endl;
45 }
46 vec2.shrink_to_fit();
47 cout << vec2.size() << ends << vec2.capacity() << endl;
48 return 0;
49 }
//3.迭代器
/*
開始指標vec.begin()
末尾指標: vec.end()
指向常量的開始指標: vec.cbegin()
指向常量的末尾指標: vec.cend()
*/
//4.元素的訪問
/*
下標訪問: vec[1] //並不會檢查是否越界
at方法訪問: vec.at[1] //兩者的區別就是at會檢查是否越界,
是就會丟擲out of range異常
訪問第一個元素: vec.front()
訪問最後一個元素: vec.back()
******* C++11的特性
返回一個指標: int*p=vec.data() // vector在記憶體中是一個陣列,
可以返回一個指標指向這個陣列
*/
測試程式碼
1 int main() {
2 vector<char> ave,ml;
3 for (int i = 0; i < 26; i++) {
4 ave.push_back(i + 65);
5 }
6 vector<char>::iterator it = ave.begin();
7 for (; it != ave.end(); it++) {
8 cout << *it << ends;
9 }cout << endl;
10 //元素翻轉
11 reverse(ave.begin(), ave.end());
12 for (it = ave.begin(); it != ave.end(); it++) {
13 cout << *it << ends;
14 }cout << endl;
15 //reverse_copy() reverse_copy(sourceBeg,sourceEnd,destBeg)
16 //將源區間soureBeg sourceEnd 內的元素複製到以destBeg起始的目標區間
17 //並顛倒安置次序
18 reverse_copy(ave.begin(), ave.end(),ml.begin());
19 //元素排序
20 //sort(vec.begin(), vec.end());
21 for (it = ml.begin(); it != ml.end(); it++) {
22 cout << *it << ends;
23 }cout << endl;
24 return 0;
25 }
本人水平有限如有問題歡迎指出