標準模板庫(STL)是 C++ 的核心類庫,提供了豐富的容器類別。STL 容器主要分為三大類:序列容器(如 vector、list、deque)、關聯容器(如 set、map)以及容器適配器(如 stack、queue、priority_queue)。此外還有 bitset、string 等專用容器。本系列將重點介紹七種基礎容器:vector、list、deque、set、multiset、map、multimap。
序列容器按照線性順序存儲元素,每個元素都有固定位置。三種主要序列容器分別為:
#include <vector>
vector 是動態陣列的類模板,內部封裝了豐富操作。作為類,它提供四種建構函式:
建立長度為 0 的空向量:vector<int> v1;
vector<int> v2(n, 0); 建立含 n 個元素的向量,初始值為 0(第二參數可省略)。
vector<int> v3(v2); 以現有向量完整複製建立新向量。
vector<int> v4(first, last); 以半開區間 [first, last) 初始化。
#include <cstring>
#include <vector>
#include <iostream>
using namespace std;
int ar[10] = {12, 45, 234, 64, 12, 35, 63, 23, 12, 55};
char* str = "Hello World";
int main() {
vector<int> vec1(ar, ar + 10);
vector<char> vec2(str, str + strlen(str));
cout << "vec1:" << endl;
for (vector<int>::const_iterator p = vec1.begin(); p != vec1.end(); ++p)
cout << *p;
cout << '\n' << "vec2:" << endl;
for (vector<char>::const_iterator p1 = vec2.begin(); p1 != vec2.end(); ++p1)
cout << *p1;
cout << '\n';
return 0;
}
以下範例展示 begin()、end()、push_back()、assign()、front()、back()、erase()、empty()、at()、size() 等核心函式:
#include <iostream>
#include <vector>
using namespace std;
typedef vector<int> INTVECTOR;
int main() {
INTVECTOR vec1;
INTVECTOR vec2(10, 6);
INTVECTOR vec3(vec2.begin(), vec2.begin() + 3);
INTVECTOR::iterator i;
// 顯示初始狀態
cout << "vec1.begin()--vec1.end():" << endl;
for (i = vec1.begin(); i != vec1.end(); ++i) cout << *i << " ";
cout << endl;
cout << "vec2.begin()--vec2.end():" << endl;
for (i = vec2.begin(); i != vec2.end(); ++i) cout << *i << " ";
cout << endl;
cout << "vec3.begin()--vec3.end():" << endl;
for (i = vec3.begin(); i != vec3.end(); ++i) cout << *i << " ";
cout << endl;
// 新增與插入操作
vec1.push_back(2);
vec1.push_back(4);
vec1.insert(vec1.begin() + 1, 5);
vec1.insert(vec1.begin() + 1, vec3.begin(), vec3.end());
cout << "after push() and insert() now the vec1 is:" << endl;
for (i = vec1.begin(); i != vec1.end(); ++i) cout << *i << " ";
cout << endl;
// 賦值操作
vec2.assign(8, 1);
cout << "vec2.assign(8,1):" << endl;
for (i = vec2.begin(); i != vec2.end(); ++i) cout << *i << " ";
cout << endl;
// 存取操作
cout << "vec1.front()=" << vec1.front() << endl;
cout << "vec1.back()=" << vec1.back() << endl;
cout << "vec1.at(4)=" << vec1.at(4) << endl;
cout << "vec1[4]=" << vec1[4] << endl;
// 刪除操作
vec1.pop_back();
vec1.erase(vec1.begin() + 1, vec1.end() - 2);
cout << "vec1.pop_back() and vec1.erase():" << endl;
for (i = vec1.begin(); i != vec1.end(); ++i) cout << *i << " ";
cout << endl;
// 狀態查詢
cout << "vec1.size(): " << vec1.size() << endl;
cout << "vec1.empty(): " << vec1.empty() << endl;
return 0;
}
Java 的 Vector 是物件集合,元素可為不同型別,支援增刪,但無法直接存放基本資料型別,這與 C++ 模板機制有本質差異。
透過本文介紹,相信讀者能更深入理解 vector 容器的運作機制與實際應用。