C++進階-3-2vector容器
阿新 • • 發佈:2022-05-07
C++進階-3-2vector容器
1 #include<iostream> 2 #include<vector> 3 4 using namespace std; 5 6 // vector 容器 7 8 9 // 1.vector容器建構函式 10 11 void printVector1(vector<int> &v) { 12 for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { 13 cout << *it << ""; 14 } 15 cout << endl; 16 } 17 18 void test01() { 19 20 // 預設構造 21 vector<int> v1; 22 23 for (int i = 0; i < 10; i++) { 24 v1.push_back(i); 25 } 26 printVector1(v1); 27 28 // 通過區間方式進行構造 29 vector<int> v2(v1.begin(), v1.end());30 printVector1(v2); 31 32 // 通過n個elem方式構造 33 vector<int>v3(10, 100); 34 printVector1(v3); 35 36 // 拷貝構造 37 vector<int> v4(v3); 38 printVector1(v4); 39 40 } 41 42 // 2.vector賦值操作 43 44 void printVector2(vector<int> &v) { 45 for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { 46 cout << *it << " "; 47 } 48 cout << endl; 49 } 50 51 void test02() { 52 53 // 初始化 54 vector<int> v1; 55 for (int i = 0; i < 10; i++) { 56 v1.push_back(i); 57 } 58 printVector2(v1); 59 60 // 賦值 operator= 61 vector<int> v2; 62 v2 = v1; 63 printVector2(v2); 64 65 // 賦值 assign 66 vector<int> v3; 67 v3.assign(v1.begin(),v1.end()); 68 printVector2(v3); 69 70 // 賦值 assign 的 n 個 elem 方式 71 vector<int> v4; 72 v4.assign(10, 100); 73 printVector2(v4); 74 75 } 76 77 // 3.vector容量和大小 78 79 void printVector3(vector<int>& v) { 80 for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { 81 cout << *it << " "; 82 } 83 cout << endl; 84 } 85 void test03() { 86 87 // 初始化 88 vector<int> v1; 89 for (int i = 0; i < 10; i++) { 90 v1.push_back(i); 91 } 92 printVector3(v1); 93 94 // 判斷是否為空,true=為空 95 if (v1.empty()) { 96 cout << "v1為空" << endl; 97 } 98 else { 99 cout << "v1不為空" << endl; 100 cout << "v1的容量為:" << v1.capacity() << endl; 101 cout << "v1的大小為:" << v1.size() << endl; 102 } 103 104 // 重新指定大小 105 // 如果重新指定的比原來容量大,預設用0填充新位置 106 v1.resize(15); 107 printVector3(v1); 108 v1.resize(17, 100); // 可以指定填充數是什麼 109 printVector3(v1); 110 v1.resize(5, 100); // 如果指定的對比原來的短了,超出部分會被刪除 111 printVector3(v1); 112 113 } 114 115 // 4.vector插入和刪除 116 117 void printVector4(vector<int>& v) { 118 for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { 119 cout << *it << " "; 120 } 121 cout << endl; 122 } 123 124 void test04() { 125 126 vector<int> v1; 127 128 // 尾插 129 v1.push_back(10); 130 v1.push_back(20); 131 v1.push_back(30); 132 v1.push_back(40); 133 v1.push_back(50); 134 135 // 遍歷 136 printVector4(v1); 137 138 // 尾刪 139 v1.pop_back(); 140 printVector4(v1); 141 142 // 插入 143 v1.insert(v1.begin(), 100); // 第一個引數必須是迭代器 144 printVector4(v1); 145 146 v1.insert(v1.begin(), 3, 1000); // n個elem的方式 147 printVector4(v1); 148 149 // 刪除 150 v1.erase(v1.begin()); 151 printVector4(v1); 152 153 // 清空 154 //v1.erase(v1.begin(), v1.end()); 155 //printVector4(v1); 156 157 v1.clear(); 158 printVector4(v1); 159 160 } 161 162 // 5.vector資料存取 163 void test05() { 164 165 // 初始化 166 vector<int> v1; 167 for (int i = 0; i < 10; i++) { 168 v1.push_back(i); 169 } 170 171 // 利用 [] 的方式來訪問陣列中的元素 172 for (int i = 0; i < v1.size(); i++) { 173 cout << v1[i] << " "; 174 } 175 cout << endl; 176 177 // 利用 at 的方式來訪問陣列中的元素 178 for (int i = 0; i < v1.size(); i++) { 179 cout << v1.at(i) << " "; 180 } 181 cout << endl; 182 183 // 獲取第一個元素 184 cout << "第一個元素:" << v1.front() << endl; 185 186 // 獲取最後一個元素 187 cout << "最後一個元素:" << v1.back() << endl; 188 189 } 190 191 // 6.vector互換容器 192 193 void printVector6(vector<int>& v) { 194 for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { 195 cout << *it << " "; 196 } 197 cout << endl; 198 } 199 void test06() { 200 201 // 1.基本用途 swap() 202 cout << "基本用法:" << endl; 203 204 // 初始化 205 vector<int> v1; 206 for (int i = 0; i < 10; i++) { 207 v1.push_back(i); 208 } 209 cout << "交換前:" << endl; 210 printVector6(v1); 211 212 vector<int> v2; 213 for (int i = 10; i > 0; i--) { 214 v2.push_back(i); 215 } 216 printVector6(v2); 217 218 cout << "交換後:" << endl; 219 v1.swap(v2); 220 printVector6(v1); 221 printVector6(v2); 222 223 // 2.實際用途 224 cout << endl; 225 cout << "實際用法:" << endl; 226 227 vector<int>v; 228 for (int i = 0; i < 100000; i++) { 229 v.push_back(i); 230 } 231 232 cout << "v的容量是:" << v.capacity() << endl; 233 cout << "v的大小是:" << v.size() << endl; 234 235 v.resize(3); // 重新指定容量大小 236 cout << "v的容量是:" << v.capacity() << endl; 237 cout << "v的大小是:" << v.size() << endl; 238 239 // 巧用swap收縮記憶體 240 vector<int>(v).swap(v); 241 cout << "v的容量是:" << v.capacity() << endl; 242 cout << "v的大小是:" << v.size() << endl; 243 // vcetor<int>(v) 匿名物件,當前行執行完,系統自動回收 244 } 245 246 // 7.vector預留空間 247 // 減少vector在動態擴充套件時的擴充套件次數 248 // reserve(int len); // 容器預留出len個元素的長度,預留位置不做初始化,元素不可訪問(與resize不同) 249 void test07() { 250 251 // 統計存100000個數,要重新開闢多少次空間 252 vector<int> v1; 253 int num = 0; // 統計開闢次數 254 int* p = NULL; 255 for (int i = 0; i < 100000; i++) { 256 v1.push_back(i); 257 258 if (p != &v1[0]) { 259 p = &v1[0]; 260 num++; 261 } 262 } 263 cout << "num :" << num << endl; // num = 30 264 265 // 可以使用reserve提前預留空間,減少開闢次數 266 vector<int> v2; 267 v2.reserve(100000); 268 int num1 = 0; // 統計開闢次數 269 int* p1 = NULL; 270 for (int i = 0; i < 100000; i++) { 271 v2.push_back(i); 272 273 if (p1 != &v2[0]) { 274 p1 = &v2[0]; 275 num1++; 276 } 277 } 278 cout << "num1 :" << num1 << endl; // num1 = 1 279 280 } 281 282 int main() { 283 284 // 1.vector容器建構函式 285 //test01(); 286 287 // 2.vector賦值操作 288 //test02(); 289 290 // 3.vector容量和大小 291 //test03(); 292 293 // 4.vector插入和刪除 294 //test04(); 295 296 // 5.vector資料存取 297 //test05(); 298 299 // 6.vector互換容器 300 //test06(); 301 302 // 7.vector預留空間 303 test07(); 304 305 system("pause"); 306 307 return 0; 308 } 309 310 311 // 總結 312 // 313 // vector 容器 314 // 315 // 功能:vector容器資料結構與陣列非常相似,也稱為單端陣列 316 // 與普通陣列區別:陣列是靜態空間,vector可以動態擴充套件 317 // 並不是在原空間後續更新新空間,而是找更大的記憶體空間,然後將原資料拷貝新空間,釋放原空間 318 // 319 // vector容器的迭代器是支援 隨機訪問 的迭代器 320 //