C++ STL 容器 vector

vector 是 C++ 對數據結構動態數組的實現。要使用 vector,請在程序頭添加:

#include <vector>  
using name space std;  

vector 對象的定義與初始化

vector<int> v; //定義一個空 vector 對象
vector<int> v(10); //定義一個具有 10 個元素的 vector 對象(int 型元素默認初始化爲 0)
vector<int> v(3,5); //v = { 5, 5, 5 }
vector<int> v1(v); //v1 = v
vector<int> v = { 1, 2, 3 };
vector<int> v1 = v;

也可以使用一對迭代器來將 vector 初始化爲由這對迭代器所指示的元素序列,此時不要求這兩個容器的類型相同,甚至也不要求它們的元素類型相同,而只需要它們的元素類型可以相互轉化即可。如:

set<char> s { 'a', 'b', 'c' };
vector<int> v (s.begin(), s.end()); // v = { 97, 98 , 99}

向 vector 對象添加元素

由於 vector 的實現機制,使得 vector 在尾端追加元素的平均用時較短,但在首部插入元素卻很慢,故 vector 並不提供像 .push_front() 這樣的成員函數。儘管如此,使用.insert()還是可以實現在 vector 的首部插入元素,只不過這樣很慢。因此,若需要在首部頻繁插入元素,可以考慮使用 deque

使用 push_back 在 vector 尾部插入元素

vector<int> v = { 1, 2, 3 };
v.push_back(4); // v = { 1, 2, 3, 4 };

使用 insert 在 vector 任意位置插入元素

插入單個元素

vector<int> v = { 1, 2, 3 };
v.insert(dp.begin(), 4); // v = { 4, 1, 2, 3 };

插入一段元素

vector<int> v = { 1, 2 };
vector<int> v_1 = { 3, 4 };
v_1.insert(v_1.begin(), v.begin(), v.end()); // v = { 1, 2, 3, 4 };

在循環中插入元素
插入元素通常會使迭代器失效,這會給在循環中插入元素帶來不小的麻煩。insert 操作在插入元素成功後會返回插入位置的有效迭代器。

vector<int> v = { 1, 2 };
vector<int> v_1 = { 3, 4 };
auto it = v_1.begin();
for (auto e:v)
	auto it = v_1.insert(it, e);
// v_1 = { 2, 1, 3, 4 };

刪除 vector 中的一個元素

使用 pop_back 刪除 vector 尾元素

vector<int> v = { 1, 2, 3 };
v.pop_back(4); // v = { 1, 2 };

使用 erase 刪除 vector 中任意位置的元素

刪除一個元素

vector<int> v = { 1, 2, 3 };
v.erase(v.begin()); // v = { 2, 3 };

刪除一段元素

vector<int> v = { 1, 2, 3, 4 };
v.erase(v.begin(), v.begin()+2); // v = { 3, 4 };

在循環中刪除元素
刪除元素通常會使迭代器失效,這會給在循環中刪除元素帶來不小的麻煩。erase 操作在插入元素成功後會返回插入位置的有效迭代器。

vector<int> v = { 1, 2, 3, 4 };
auto it = v.beign();
while (it!=v.end()) {
	//刪除值爲奇數的元素,跳過值爲偶數的元素
	if (*it%2)
		auto it = v.erase(it);
	else
		it++;
	}
// v = { 2, 4 };

訪問查找 vector 中的元素

使用下標訪問

像數組一樣,vector 支持下標隨機訪問

vector<int> v = { 1, 2, 3, 4 };
cout << v[1]; // 輸出 2

使用迭代器進行訪問

vector<int> v = { 1, 2, 3, 4 };
//將 v 中值爲奇數的元素置爲 0
for (auto it=v.begin(); it!=v.end(); it++) {
    if (*it%2)
    	*it = 0;
}
// v = { 0, 2,0, 4};

使用 C++ 11 新特性訪問

vector<int> v = { 1, 2, 3, 4 };
//將 v 中值爲奇數的元素置爲 0
for (auto n : v) {
    if (n%2) 
    	cout << n;
}
// 輸出:1 3

注意:這種方式得到的 n 是 v 中元素的拷貝,若想要得到 v 元素的本身,請使用 &
for (auto &n:v)

查找一個元素是否在 vector 中

vector 沒有查找元素存在性的成員函數,請使用順序容器的通用方法。

vector<int> v = { 1, 2, 3, 4 };
auto it_1 = find(v.begin(), v.end(), 1); // it_1 = v.begin();
autp it_2 = find(v.begin(), v.end(), 9); // it_2 = v.end();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章