一:介紹
vector是C++標準模板庫,是一個容器,底層是陣列,為連續記憶體。
名稱空間為std,所屬標頭檔案為<vector> 注意:不是<vector.h>
vector儲存資料時,會分配一個儲存空間,如果繼續儲存,該分配的空間已滿,就會分配一塊更大的記憶體,把原來的資料複製過來,繼續儲存,這些效能也會一定程度上會有損耗
二:常用操作
1.容量
a.vector大小:vector.size()
b.vector所佔記憶體實際大小:vector.capacity()
2.修改
a.尾部新增元素:vector.push_back()
b.尾部刪除元素:vector.pop_back()
c.交換兩個vector元素:vector.swap()
d.清空vector元素:vector.clear()
e.刪除指定元素:vector.erase(it)
3.迭代器
a.vector開始指標:vector.begin()
b.vector尾部指標:vector.end() 注:最後一個元素的下一個位置,類似為NULL,不是容器的最後一個元素
4.訪問元素
a.下標訪問:vector[1] //不檢查是否越界
b.at方法訪問:vector.at(1) //自動檢查是否越界,如越界會丟擲異常
c.訪問第一個元素:vector.front()
d.訪問最後一個元素:vector.back()
三:儲存
1 //儲存方式1 2 vector<int> v1(10); 3 for (int i=0; i<10; i++) 4 { 5 v1[i] = i; 6 } 7 //儲存方式2 8 vector<int> v2; 9 for (int i=0; i<10; i++) 10 { 11 v2.push_back(i); 12 }
儲存結構體和結構體指標
1 struct Student 2 { 3 char name[32]; 4 int age; 5 }; 6 7 //儲存結構體 8 vector<Student> vStu1; 9 for (int i=0; i<10; i++) 10 { 11 Student stu; 12 strcpy(stu.name, "woniu201"); 13 stu.age = 30 + i; 14 vStu1.push_back(stu); 15 } 16 //儲存結構體指標 17 vector<Student*> vStu2; 18 for (int i=0; i<10; i++) 19 { 20 Student* pStu = (Student*)malloc(sizeof(Student)); 21 strcpy(pStu->name, "woniu201"); 22 pStu->age = 30 + i; 23 vStu2.push_back(pStu); 24 }
四:遍歷
1 vector<int> v; 2 for (int i=0; i<100; i++) 3 { 4 v.push_back(i); 5 } 6 //遍歷方式1 7 for (int i=0; i<100; i++) 8 { 9 int& a = v[i]; 10 printf("%d ", a); 11 } 12 //遍歷方式2 13 for (vector<int>::iterator it = v.begin(); it != v.end(); it++) 14 { 15 int&a = *it; 16 printf("%d ", a); 17 }
五:排序
對vector整形進行排序
1 #include "stdlib.h" 2 #include <vector> 3 #include <algorithm> 4 5 using namespace std; 6 7 //升序比較函式 8 int compare1(const int &a, const int &b) 9 { 10 return a < b; 11 } 12 13 //降序比較函式 14 int compare2(const int &a, const int &b) 15 { 16 return a > b; 17 } 18 19 int main() 20 { 21 vector<int> v; 22 for (int i=0; i<10; i++) 23 { 24 v.push_back(rand() % 10); 25 } 26 27 //遍歷輸出 28 printf("排序前資料:"); 29 for (vector<int>::iterator it = v.begin(); it != v.end(); it++) 30 { 31 printf("%d ", *it); 32 } 33 34 //升序排序 35 sort(v.begin(), v.end(), compare1); 36 37 //遍歷輸出 38 printf("\n升序後資料:"); 39 for (vector<int>::iterator it = v.begin(); it != v.end(); it++) 40 { 41 printf("%d ", *it); 42 } 43 44 //降序排序 45 sort(v.begin(), v.end(), greater<int>()); 46 47 //遍歷輸出 48 printf("\n降序後資料:"); 49 for (vector<int>::iterator it = v.begin(); it != v.end(); it++) 50 { 51 printf("%d ", *it); 52 } 53 54 getchar(); 55 return 1; 56 }
對存放類成員變數排序
1 #include <string> 2 #include <vector> 3 #include <algorithm> 4 using namespace std; 5 6 class Student { 7 public: 8 Student(string n, int c) :name(n), core(c) {} 9 10 string name; 11 int core; 12 }; 13 14 //升序比較函式 15 bool compare1(const Student& s1, const Student& s2) 16 { 17 return s1.core < s2.core; 18 } 19 20 //降序比較函式 21 bool compare2(const Student& s1, const Student& s2) 22 { 23 return s1.core > s2.core; 24 } 25 26 27 int main() 28 { 29 vector<Student> v; 30 Student s1("aaaa", 97); 31 Student s2("bbbb", 99); 32 Student s3("cccc", 95); 33 34 v.push_back(s1); 35 v.push_back(s2); 36 v.push_back(s3); 37 38 printf("排序前資料:\n"); 39 for (vector<Student>::iterator it = v.begin(); it != v.end(); it++) 40 { 41 printf("%s; %d\n", ((*it).name).c_str(), (*it).core); 42 } 43 44 //升序排序 45 sort(v.begin(), v.end(), compare1); 46 47 printf("\n升序後的資料:\n"); 48 for (vector<Student>::iterator it = v.begin(); it != v.end(); it++) 49 { 50 printf("%s; %d\n", ((*it).name).c_str(), (*it).core); 51 } 52 53 //降序排序 54 sort(v.begin(), v.end(), compare2); 55 printf("\n降序後的資料:\n"); 56 for (vector<Student>::iterator it = v.begin(); it != v.end(); it++) 57 { 58 printf("%s; %d\n", ((*it).name).c_str(), (*it).core); 59 } 60 getchar(); 61 return 1; 62 }
六:查詢
1 vector<int>::iterator it = find(v.begin(), v.end(), 5); 2 if(it != v.end()) 3 { 4 cout << "found"; 5 } 6 else 7 { 8 cout << "not found"; 9 }
七:刪除
1 for(vector<int>::iterator it=v.begin(); it != v.end(); it++) 2 { 3 if(*it == 8) 4 { 5 it = v.erase(it);//it會++一次 6 it--; //刪除完後需要--,否則最終迴圈越界 7 } 8 }
八:釋放記憶體
存放整形vector釋放
1 //存放整型 2 vector<int> v; 3 for (int i=0; i<100; i++) 4 { 5 v.push_back(i); 6 } 7 //釋放記憶體 8 vector<int> (v).swap(v);
存放結構體vector釋放
//儲存結構體 vector<Student> vStu1; for (int i=0; i<10; i++) { Student stu; strcpy(stu.name, "wangpengfei"); stu.age = 30 + i; vStu1.push_back(stu); } //釋放記憶體 vector<Student> (vStu1).swap(vStu1);
存放結構體指標vector釋放
1 //儲存結構體指標 2 vector<Student*> vStu2; 3 for (int i=0; i<10; i++) 4 { 5 Student* pStu = (Student*)malloc(sizeof(Student)); 6 strcpy(pStu->name, "wangpengfei"); 7 pStu->age = 30 + i; 8 vStu2.push_back(pStu); 9 } 10 //釋放記憶體 11 for (vector<Student*>::iterator it = vStu2.begin(); it != vStu2.end(); it++) 12 { 13 if (NULL != *it) 14 { 15 delete *it; 16 *it = NULL; 17 } 18 }
掃碼關注公眾號
專注分享Java,C/C++,STL,Spring框架,mybatis框架,mysql,redis,分散式,高併發,設計模式,爬蟲,docker,shell程式設計等相關技術,在這裡一起探討,一起學習,一起進步,不定期分享視訊書籍資源,充分利用碎片化時間,讓我們的技術之路更加有樂趣。