如需轉載,請註明出處。
Vector和普通數組之間的差異:
普通數組遵循靜態方法,意味着它的大小在運行時不能更改,而vector實現動態數組意味着它在附加元素時自動調整大小。
向量與動態數組相同,能夠在插入或刪除元素時自動調整自身大小,其存儲由容器自動處理。向量元素放置在連續存儲中,以便可以使用迭代器訪問和遍歷它們。在向量中,最後插入數據。最後插入需要不同的時間,因爲有時可能需要擴展陣列。刪除最後一個元素只需要一個恆定的時間,因爲沒有調整大小。在開頭或中間插入和擦除是線性的。
語法:
vector<object_type> v1;
與向量關聯的某些函數是:
一.迭代器
begin() - 返回指向向量中第一個元素的迭代器
end() - 返回一個迭代器,指向跟隨向量中最後一個元素的理論元素
rbegin() - 返回指向向量中最後一個元素的反向迭代器(反向開始)。它從最後一個元素移動到第一個元素
rend() - 返回一個反向迭代器,指向向量中第一個元素之前的理論元素(被視爲反向結束)
cbegin() - 返回指向向量中第一個元素的常量迭代器。
cend() - 返回一個常量迭代器,指向跟隨向量中最後一個元素的理論元素。
crbegin() - 返回一個指向向量中最後一個元素的常量反向迭代器(反向開始)。它從最後一個元素移動到第一個元素
crend() - 返回一個常量反向迭代器,指向向量中第一個元素之前的理論元素(被視爲反向結束)
// C++ program to illustrate the
// iterators in vector
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> g1;
for (int i = 1; i <= 5; i++)
g1.push_back(i);
cout << "Output of begin and end: ";
for (auto i = g1.begin(); i != g1.end(); ++i)
cout << *i << " ";
cout << "\nOutput of cbegin and cend: ";
for (auto i = g1.cbegin(); i != g1.cend(); ++i)
cout << *i << " ";
cout << "\nOutput of rbegin and rend: ";
for (auto ir = g1.rbegin(); ir != g1.rend(); ++ir)
cout << *ir << " ";
cout << "\nOutput of crbegin and crend : ";
for (auto ir = g1.crbegin(); ir != g1.crend(); ++ir)
cout << *ir << " ";
return 0;
}
輸出:
Output of begin and end: 1 2 3 4 5
Output of cbegin and cend: 1 2 3 4 5
Output of rbegin and rend: 5 4 3 2 1
Output of crbegin and crend : 5 4 3 2 1
二.容量
size() - 返回向量中的元素數。
max_size() - 返回向量可容納的最大元素數。
capacity() - 返回當前分配給向量的存儲空間的大小,表示爲元素數。
resize() - 調整容器的大小,使其包含'g'元素。
empty() - 返回容器是否爲空。
shrink_to_fit() - 減小容器的容量以適應其大小並銷燬超出容量的所有元素。
reserve() - 請求向量容量至少足以包含n個元素。
// C++ program to illustrate the
// capacity function in vector
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> g1;
for (int i = 1; i <= 5; i++)
g1.push_back(i);
cout << "Size : " << g1.size();
cout << "\nCapacity : " << g1.capacity();
cout << "\nMax_Size : " << g1.max_size();
// resizes the vector size to 4
g1.resize(4);
// prints the vector size after resize()
cout << "\nSize : " << g1.size();
// checks if the vector is empty or not
if (g1.empty() == false)
cout << "\nVector is not empty";
else
cout << "\nVector is empty";
// Shrinks the vector
g1.shrink_to_fit();
cout << "\nVector elements are: ";
for (auto it = g1.begin(); it != g1.end(); it++)
cout << *it << " ";
return 0;
}
輸出:
Size : 5
Capacity : 8
Max_Size : 4611686018427387903
Size : 4
Vector is not empty
Vector elements are: 1 2 3 4
三.元素訪問
reference operator [g] - 返回向量中位置“g”處元素的引用
at(g) - 返回向量中位置“g”處元素的引用
front() - 返回對向量中第一個元素的引用
back() - 返回對向量中最後一個元素的引用
data() - 返回指向內部由向量使用的內存數組的直接指針,以存儲其擁有的元素。
// C++ program to illustrate the
// element accesser in vector
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<int> g1;
for (int i = 1; i <= 10; i++)
g1.push_back(i * 10);
cout << "\nReference operator [g] : g1[2] = " << g1[2];
cout << "\nat : g1.at(4) = " << g1.at(4);
cout << "\nfront() : g1.front() = " << g1.front();
cout << "\nback() : g1.back() = " << g1.back();
// pointer to the first element
int* pos = g1.data();
cout << "\nThe first element is " << *pos;
return 0;
}
輸出:
Reference operator [g] : g1[2] = 30
at : g1.at(4) = 50
front() : g1.front() = 10
back() : g1.back() = 100
The first element is 10
四.修改器
assign() - 它通過替換舊元素爲向量元素賦值
push_back() - 它將元素從後面推入向量
pop_back() - 用於從後面彈出或刪除矢量中的元素。
insert() - 它在元素之前在指定位置插入新元素
erase() - 用於從指定的位置或範圍中刪除容器中的元素。
swap() - 用於將一個向量的內容與另一個相同類型的向量交換。尺寸可能不同。
clear() - 用於刪除向量容器的所有元素
emplace() - 它通過在位置插入新元素來擴展容器
emplace_back() - 用於將新元素插入向量容器中,新元素被添加到向量的末尾
// C++ program to illustrate the
// Modifiers in vector
#include <bits/stdc++.h>
#include <vector>
using namespace std;
int main()
{
// Assign vector
vector<int> v;
// fill the array with 10 five times
v.assign(5, 10);
cout << "The vector elements are: ";
for (int i = 0; i < v.size(); i++)
cout << v[i] << " ";
// inserts 15 to the last position
v.push_back(15);
int n = v.size();
cout << "\nThe last element is: " << v[n - 1];
// removes last element
v.pop_back();
// prints the vector
cout << "\nThe vector elements are: ";
for (int i = 0; i < v.size(); i++)
cout << v[i] << " ";
// inserts 5 at the beginning
v.insert(v.begin(), 5);
cout << "\nThe first element is: " << v[0];
// removes the first element
v.erase(v.begin());
cout << "\nThe first element is: " << v[0];
// inserts at the beginning
v.emplace(v.begin(), 5);
cout << "\nThe first element is: " << v[0];
// Inserts 20 at the end
v.emplace_back(20);
n = v.size();
cout << "\nThe last element is: " << v[n - 1];
// erases the vector
v.clear();
cout << "\nVector size after erase(): " << v.size();
// two vector to perform swap
vector<int> v1, v2;
v1.push_back(1);
v1.push_back(2);
v2.push_back(3);
v2.push_back(4);
cout << "\n\nVector 1: ";
for (int i = 0; i < v1.size(); i++)
cout << v1[i] << " ";
cout << "\nVector 2: ";
for (int i = 0; i < v2.size(); i++)
cout << v2[i] << " ";
// Swaps v1 and v2
v1.swap(v2);
cout << "\nAfter Swap \nVector 1: ";
for (int i = 0; i < v1.size(); i++)
cout << v1[i] << " ";
cout << "\nVector 2: ";
for (int i = 0; i < v2.size(); i++)
cout << v2[i] << " ";
}
輸出:
The vector elements are: 10 10 10 10 10
The last element is: 15
The vector elements are: 10 10 10 10 10
The first element is: 5
The first element is: 10
The first element is: 5
The last element is: 20
Vector size after erase(): 0
Vector 1: 1 2
Vector 2: 3 4
After Swap
Vector 1: 3 4
Vector 2: 1 2