介紹
除去向 vector 添加元素(如 push_back)之外,vector 還提供了許多其他操作,這些操作大多與 string 的操作類似。通過掌握這些操作,我們可以方便地查詢、修改和比較 vector 中的元素,從而構建靈活、高效的數據結構。下表總結了 vector 支持的一些常見操作:
操作 | 說明 |
---|---|
v.empty() | 如果 v 不包含任何元素,則返回 true;否則返回 false。 |
v.size() | 返回 v 中元素的個數,其返回值類型為 vector::size_type。 |
v.push_back(t) | 將值為 t 的元素添加到 v 的尾端。 |
v[n] | 返回 v 中第 n 個位置上元素的引用,下標從 0 開始。 |
v1 = v2 | 用 v2 中元素的副本替換 v1 中原有的所有元素。 |
v1 = {a, b, c, ...} | 使用列表中元素的副本替換 v1 中原有的所有元素。 |
v1 == v2 / v1 != v2 | 當且僅當兩個 vector 的元素個數相同且對應位置的元素都相等時,v1 和 v2 才相等。 |
<, <=, >, >= | 按字典順序比較兩個 vector,規則與 string 相似:若兩個 vector 在對應位置的元素全部相同,則元素較少者視為較小;否則以第一對不相同元素的比較結果為準。 |
下面我們依次介紹這些操作及其使用方法。
1. 查詢與修改 vector 中的元素
1.1 empty() 與 size()
-
empty()
檢查 vector 是否為空。若 vector 沒有任何元素,則返回 true,否則返回 false。 -
size()
返回 vector 中當前元素的個數。返回類型通常為 vector::size_type,一般為無符號整型。
示例:
#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::endl;int main() {vector<int> v; // 默認初始化為空 vectorif (v.empty())cout << "v is empty." << endl;v.push_back(10);v.push_back(20);cout << "v size: " << v.size() << endl; // 輸出 v 的元素個數return 0;
}
1.2 訪問元素:下標運算符 []
使用下標運算符([])可以隨機訪問 vector 中指定位置的元素。注意,下標從 0 開始。例如:
#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::endl;int main() {vector<int> v = { 1, 2, 3, 4, 5 };cout << "The third element is: " << v[2] << endl; // 輸出 3// 修改元素v[2] = v[2] * v[2]; // 將第三個元素改為其平方cout << "After modification, the third element is: " << v[2] << endl;return 0;
}
注意:
使用下標運算符時必須確保下標在合法范圍內。如果訪問不存在的元素(例如對空 vector 或超出范圍的索引進行操作),將產生未定義行為,這可能引發緩沖區溢出問題。
2. 遍歷 vector 元素
2.1 使用范圍 for 語句
范圍 for 語句可以用來遍歷 vector 中的所有元素。對于只讀操作,直接使用 auto 即可;若需要修改元素,必須使用引用:
只讀遍歷
#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::endl;int main() {vector<int> v = {1, 2, 3, 4, 5};// 輸出每個元素for (auto i : v) {cout << i << " ";}cout << endl;return 0;
}
修改元素
#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::endl;int main() {vector<int> v = {1, 2, 3, 4, 5};// 將 vector 中每個元素乘以自身for (auto &i : v) { // 注意:必須使用引用i *= i;}// 輸出修改后的元素for (auto i : v) {cout << i << " ";}cout << endl;return 0;
}
3. vector 對象的比較操作
vector 支持相等性和關系運算符,這些運算符的語義與 string 類似:
- == 和 !=
兩個 vector 相等當且僅當它們的元素個數相同且對應位置的元素都相等。 - <, <=, >, >=
按字典順序比較兩個 vector。如果兩個 vector 在對應位置上元素完全相同,則較短的 vector 被認為較小;如果存在第一對不相同的元素,則比較該對元素的大小。
示例:
#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::endl;int main() {vector<int> v1 = {1, 2, 3};vector<int> v2 = {1, 2, 3};vector<int> v3 = {1, 2, 4};if (v1 == v2)cout << "v1 and v2 are equal." << endl;if (v1 < v3)cout << "v1 is less than v3." << endl;return 0;
}
4. 賦值和替換
vector 支持賦值操作符,用于將一個 vector 的內容替換為另一個 vector 的元素副本:
#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::endl;int main() {vector<int> v1 = {1, 2, 3};vector<int> v2 = {4, 5, 6};v1 = v2; // v1 的元素全部被替換為 v2 的元素cout << "After assignment, v1: ";for (auto i : v1)cout << i << " ";cout << endl;return 0;
}
此外,也可以使用列表初始化對 vector 進行賦值(C++11 起支持):
#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::endl;int main() {vector<int> v = {1, 2, 3};v = {7, 8, 9}; // 將 v 中的內容替換為 7, 8, 9 的副本cout << "After list-assignment, v: ";for (auto i : v)cout << i << " ";cout << endl;return 0;
}
5. 關于下標操作的警告
-
下標運算符只能訪問已存在的元素
下標形式僅適用于訪問或修改 vector 內已存在的元素,而不能用于添加元素。例如,下面的代碼試圖通過下標訪問空 vector 的元素,將會導致錯誤:#include <vector> #include <iostream> using std::vector; using std::cout; using std::endl;int main() {vector<int> ivec; // 空 vector// 下面的操作是錯誤的,因為 ivec 不包含任何元素cout << ivec[0];return 0; }
-
添加元素必須使用 push_back 或類似成員函數
正確的添加方式:for (int i = 0; i < 10; ++i)ivec.push_back(i); // 依次添加元素
6. 總結
-
常用操作:
empty()
和size()
用于檢查 vector 是否為空及獲取元素數量。push_back(t)
用于在 vector 尾端添加一個新元素。- 下標運算符
v[n]
用于訪問已存在的元素(注意:僅在保證索引合法時使用)。 - 賦值操作符和列表初始化可用于替換 vector 中所有元素。
- 相等性和關系運算符基于字典順序比較 vector 中的元素。
-
遍歷與修改:
- 使用范圍 for 循環可以簡潔地遍歷 vector,但若在循環中修改容器大小(如 push_back),應避免使用范圍 for。
- 對于需要修改元素的操作,建議使用基于引用的范圍 for。
-
下標訪問的注意事項:
- 只能訪問已存在的元素,不能用下標直接添加新元素。使用 push_back、insert 等成員函數來添加。
掌握 vector 的這些常用操作,不僅有助于更高效地管理動態數組,還能防止因錯誤訪問元素而引起安全問題(例如緩沖區溢出)。希望這篇全面的講解能幫助你在實際編程中熟練使用 vector。
參考資料
- cppreference.com 關于 std::vector 的詳細文檔
- 各大 C++ 編碼規范(如 Google C++ Style Guide)中對容器操作的建議
通過對 vector 其他操作的全面解析,你可以更好地掌握如何查詢、修改和比較 vector 中的元素,從而編寫出既健壯又高效的 C++ 程序。