STL 小白學習(3) vector
阿新 • • 發佈:2018-12-24
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 }