前言:在上一篇中我們講到了string類的模擬實現,今天我們將進一步的去學習vector的一些常用的使用方法。
💖 博主CSDN主頁:衛衛衛的個人主頁 💞
👉 專欄分類:高質量C++學習 👈
💯代碼倉庫:衛衛周大胖的學習日記💫
💪關注博主和博主一起學習!一起努力!
目錄標題
- 什么是vector
- vector的使用
- vector構造函數的使用
- vector常見函數的使用
- 迭代器的使用
- rebegin()和rend()函數
- push_back():在向量的末尾添加一個元素
- pop_back():刪除向量的最后一個元素
- size():返回向量中元素的個數
- empty():檢查向量是否為空,如果為空則返回 true,否則返回 false
- capacity()
- clear():清空向量中的所有元素
- front():返回向量的第一個元素
- back():返回向量的最后一個元素
- insert():在指定位置插入一個或多個元素
- erase():刪除指定位置或指定范圍的元素
- resize():調整向量的大小
- swap():交換兩個向量的內容
- vector中operator[]
- vector中嵌套vector的二維矩陣或多維數組
什么是vector
在C++中,vector是一種動態數組容器,可以存儲一系列具有相同數據類型的元素。它提供了一些操作函數,如插入、刪除、訪問等,使得對數組進行操作更加方便和靈活。
與普通的數組相比,vector具有以下優點:
- 可以在運行時動態調整大小,不需要事先指定大小;
- 可以自動處理內存分配和釋放,減少手動管理內存的工作量;
- 提供了更多的操作函數,如插入、刪除、查找等;
- 可以通過下標訪問元素。
vector的使用
vector構造函數的使用
- 默認構造函數
vector<int> vec; // 創建一個空的整數向量
- 帶有初始值的構造函數:
int main()
{//vector<int> vec; // 創建一個空的整數向量int n = 0,value = 0;cout << "輸入元素個數" << endl;cin >> n;vector<int> vec(n); // 創建一個包含 n 個默認初始化的整數元素的向量for (auto e : vec)//遍歷容器中的值{cout << e << " ";}cout << endl;cout << "輸入元素的值" << endl;cin >> value;vector<int> vec1(n, value); // 創建一個包含 n 個值為 value 的整數元素的向量for (auto e : vec1)//遍歷容器中的值{cout << e << " ";}cout << endl;return 0;
}
- 復制構造函數
int main()
{vector<int> vec1 = { 1, 2, 3, 4, 5 }; // 創建一個包含初始元素的向量vector<int> vec2(vec1); // 使用 vec1 的副本創建向量 vec2for (auto s : vec2){cout << s << " ";}cout << endl;return 0;
}
4. 列表初始化 (C++11 及以上版本)
int main()
{vector<int> vec4{ 1, 2, 3, 4, 5 }; // 使用列表初始化創建向量 vec4for (auto s : vec4){cout << s << " ";}return 0;
}
- 區間構造函數
int main()
{vector<int> vec1 = { 1, 2, 3, 4, 5 }; // 創建一個包含初始元素的向量vector<int> vec2(vec1); // 使用 vec1 的副本創建向量 vec2for (auto s : vec2){cout << s << " ";}cout << endl;vector<int> vec3(vec1.begin(), vec1.end()); // 使用迭代器指定區間來創建向量 vec3for (auto s : vec3){cout << s << " ";}return 0;
}
vector常見函數的使用
迭代器的使用
在C++中,vector類提供了**begin()和end()**成員函數來獲取指向容器中第一個元素和最后一個元素之后位置的迭代器。
調用begin()函數會返回一個指向容器中第一個元素的迭代器。調用end()函數會返回一個指向容器中最后一個元素之后位置的迭代器。
int main()
{std::vector<int> vec = { 1, 2, 3, 4, 5 };// 使用begin()函數獲取指向第一個元素的迭代器std::vector<int>::iterator it_begin = vec.begin();// 使用end()函數獲取指向最后一個元素之后位置的迭代器std::vector<int>::iterator it_end = vec.end();// 使用迭代器遍歷vector并輸出所有元素for (std::vector<int>::iterator it = it_begin; it != it_end; ++it) {std::cout << *it << " ";}return 0;
}
rebegin()和rend()函數
在使用vector
中的rbegin()
和rend()
函數時,請按照以下步驟進行操作:
- 在代碼中包含
<vector>
頭文件。 - 創建一個
vector
對象并向其中添加元素。 - 使用
rbegin()
函數獲取指向向量最后一個元素的迭代器。 - 使用
rend()
函數獲取指向向量中第一個元素之前位置的迭代器。 - 使用循環以逆序的方式遍歷向量,從
rbegin()
函數返回的迭代器開始,到rend()
函數返回的迭代器結束。
下面是一個示例來說明用法:
#include <iostream>
#include <vector>int main() {std::vector<int> myVec = {1, 2, 3, 4, 5};// 以逆序的方式遍歷向量for (auto it = myVec.rbegin(); it != myVec.rend(); ++it) {std::cout << *it << " ";}std::cout << std::endl;return 0;
}
輸出結果:
5 4 3 2 1
在這個例子中,我們創建了一個名為myVec
的vector
對象,并用一些整數值進行了初始化。然后,我們使用for
循環和一個逆序迭代器(rbegin()
函數)和一個普通迭代器(rend()
函數)來以逆序的方式打印向量的元素。
push_back():在向量的末尾添加一個元素
int main()
{vector<int> vec;vec.push_back(10); // 向 vec 中添加元素 10vec.push_back(20); // 向 vec 中添加元素 20vec.push_back(20); // 向 vec 中添加元素 20vec.push_back(0); // 向 vec 中添加元素 20for (auto e : vec){cout << e << " ";}cout << endl;return 0;
}
pop_back():刪除向量的最后一個元素
int main()
{vector<int> vec = { 10, 20, 30,40,50 };cout << "刪除前" << endl;for (auto e : vec){cout << e << " ";}cout << endl;cout << "刪除后" << endl;vec.pop_back(); // 刪除 vec 的最后一個元素for (auto e : vec){cout << e << " ";}cout << endl;return 0;
}
size():返回向量中元素的個數
int main()
{vector<int> vec = { 10, 20, 30 };cout <<"該容器的元素個數是: " << vec.size() << endl;return 0;
}
empty():檢查向量是否為空,如果為空則返回 true,否則返回 false
int main()
{vector<int> vec = { 1,2 };bool isEmpty = vec.empty(); // 返回 true,因為 vec 是空的if (isEmpty){cout << "該容器是空的" << endl;}else{cout << "該容器不是空的" << endl;}return 0;
}
capacity()
在使用vector
的capacity()
函數時,它返回的是vector
當前分配的內存容量大小,即可以容納的元素數量。以下是使用capacity()
函數的幾個常見情況:
- 獲取
vector
的容量:使用capacity()
函數可以獲取當前vector
的容量。
#include <iostream>
#include <vector>int main() {std::vector<int> myVec;std::cout << "Vector capacity: " << myVec.capacity() << std::endl;return 0;
}
輸出結果:
Vector capacity: 0
在這個例子中,我們創建了一個名為myVec
的空vector
對象,并使用capacity()
函數獲取其容量。由于vector
是空的,所以容量為0。
- 預分配容量:有時候可以使用
reserve()
函數來預分配vector
的容量,以減少不必要的重新分配的次數。
#include <iostream>
#include <vector>int main() {std::vector<int> myVec;myVec.reserve(10); // 預分配10個元素的容量std::cout << "Vector capacity: " << myVec.capacity() << std::endl;return 0;
}
輸出結果:
Vector capacity: 10
在這個例子中,我們使用reserve()
函數預分配了10個元素的容量,然后使用capacity()
函數獲取當前容量。
- 動態調整容量:
vector
會根據需要自動調整容量,以適應元素的添加和刪除。當vector
的元素數量超過當前容量時,會自動增加容量以容納更多元素。
#include <iostream>
#include <vector>int main() {std::vector<int> myVec;std::cout << "Initial capacity: " << myVec.capacity() << std::endl;for (int i = 0; i < 10; ++i) {myVec.push_back(i);std::cout << "Vector capacity after adding " << i << ": " << myVec.capacity() << std::endl;}return 0;
}
輸出結果:
Initial capacity: 0
Vector capacity after adding 0: 1
Vector capacity after adding 1: 2
Vector capacity after adding 2: 4
Vector capacity after adding 3: 4
Vector capacity after adding 4: 8
Vector capacity after adding 5: 8
Vector capacity after adding 6: 8
Vector capacity after adding 7: 8
Vector capacity after adding 8: 16
Vector capacity after adding 9: 16
在這個例子中,我們創建了一個名為myVec
的空vector
對象,并使用capacity()
函數獲取初始容量。然后,我們使用push_back()
函數向vector
添加元素,并使用capacity()
函數獲取每次添加元素后的容量。可以看到,當元素數量超過當前容量時,vector
會動態調整容量以容納更多元素,容量的增長規律可能是指數級的(取決于編譯器)。
clear():清空向量中的所有元素
int main()
{vector<int> vec = { 10, 20, 30 };cout << "清空前" << endl;for (auto e : vec){cout << e << " ";}cout << endl;cout <<"該容器的元素個數是:" << vec.size() << endl;//查看容器中元素個數vec.clear(); // 清空 vec 中的所有元素cout << "清空后" << endl;for (auto e : vec){cout << e << " ";}cout << endl;cout << "該容器的元素個數是:" << vec.size() << endl;//查看容器中元素個數return 0;
}
front():返回向量的第一個元素
int main()
{vector<int> vec = { 10, 20, 30 };int firstElement = vec.front(); // 返回 10cout << firstElement << endl;return 0;
}
back():返回向量的最后一個元素
int main()
{vector<int> vec = { 10, 20, 30 };int lastElement = vec.back(); // 返回 30cout << lastElement << endl;return 0;
}
insert():在指定位置插入一個或多個元素
int main()
{vector<int> vec = { 10, 20, 30 };vec.insert(vec.begin() + 1, 15); // 在索引為 1 的位置插入元素 15,vec 變為 {10, 15, 20, 30}for (auto e: vec){cout << e << " ";}return 0;
}
erase():刪除指定位置或指定范圍的元素
int main()
{vector<int> vec = { 10, 20, 30 ,40, 50};vec.erase(vec.begin() + 1);vec.erase(vec.begin(), vec.begin() + 2); for (auto e: vec){cout << e << " ";}cout << endl;return 0;
}
resize():調整向量的大小
int main()
{vector<int> vec = { 10, 20, 30 };vec.resize(5); // 將 vec 調整為包含 5 個元素,未指定的元素將被默認初始化for (auto e: vec){cout << e << " ";}cout << endl;vector<int> vec1 = { 10, 20, 30 };vec1.resize(10, 9);//將vec1調整成10個元素,未被指定的元素 初始化成9for (auto e : vec1){cout << e << " ";}cout << endl;return 0;
}
swap():交換兩個向量的內容
int main()
{vector<int> vec1 = { 10, 20 };vector<int> vec2 = { 30, 40 };cout << "交換前" << endl;for (auto e : vec1){cout << e << " ";}vec1.swap(vec2); // 交換 vec1 和 vec2 的元素,vec1 變為 {30, 40},vec2 變為 {10, 20}cout << endl;cout << "交換后" << endl;for (auto e : vec1){cout << e << " ";}
}
vector中operator[]
在C++的vector
中,operator[]
是用于訪問并操作vector
中的元素的重載運算符。它允許您使用索引來訪問和修改vector
中的特定元素。以下是對operator[]
的使用示例:
#include <iostream>
#include <vector>int main() {std::vector<int> myVec = {1, 2, 3, 4, 5};// 通過使用索引來訪問和修改元素std::cout << "Element at index 2: " << myVec[2] << std::endl;myVec[3] = 10;std::cout << "Modified element at index 3: " << myVec[3] << std::endl;return 0;
}
輸出結果:
Element at index 2: 3
Modified element at index 3: 10
在這個例子中,我們創建了一個名為myVec
的vector
對象,并使用初始化列表初始化其元素。然后,我們使用operator[]
來訪問索引為2和3的元素,并分別輸出它們的值。接下來,我們將索引為3的元素修改為10,并再次使用operator[]
訪問并輸出修改后的值。
需要注意的是,operator[]
沒有邊界檢查,如果使用超出vector
有效索引范圍的索引進行訪問,會導致未定義的行為。因此,在使用operator[]
時,務必確保所使用的索引在vector
的有效范圍內。
此外,還可以將operator[]
用于循環遍歷vector
中的元素:
#include <iostream>
#include <vector>int main() {std::vector<int> myVec = {1, 2, 3, 4, 5};// 使用operator[]遍歷vector中的元素for (size_t i = 0; i < myVec.size(); ++i) {std::cout << "Element at index " << i << ": " << myVec[i] << std::endl;}return 0;
}
輸出結果:
Element at index 0: 1
Element at index 1: 2
Element at index 2: 3
Element at index 3: 4
Element at index 4: 5
在這個例子中,我們使用operator[]
在循環中遍歷vector
中的元素。通過遞增索引變量i
,我們可以依次訪問vector
中的元素,并輸出它們的索引和值。
vector中嵌套vector的二維矩陣或多維數組
在C++中,可以使用vector嵌套vector來創建二維矩陣或多維數組。這種嵌套的vector可以用于存儲和訪問多個行和列的數據。
int main() {// 定義數組的大小int rows = 3;int cols = 4;// 創建一個二維vectorstd::vector<std::vector<int>> matrix(rows, std::vector<int>(cols));// 對二維vector進行賦值int count = 1;for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {matrix[i][j] = count++;}}// 打印二維vector的內容for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {std::cout << matrix[i][j] << " ";}std::cout << std::endl;}return 0;
}
好啦,今天的內容就到這里啦,下期內容預告vector的常見函數模擬實現,博主前段時間有點事情,后面這段時間會加班加點的更新!
結語:今天的內容就到這里吧,謝謝各位的觀看,如果有講的不好的地方也請各位多多指出,作者每一條評論都會讀的,謝謝各位。