vector是一個常被使用的容器,本文對如何使用它進行初步的介紹。 ...
vector類使用介紹
簡介
標準庫類型vector
表示對象的集合,其中所有對象的類型都相同。
它是可變大小的數組,支持快速隨機訪問。因為 vector "容納著"其他對象,所以也常被稱為容器。
頭文件引入
想要使用 vector,必須包含適當的頭文件。假定在後續的例子中都進行瞭如下聲明:
#include<vector>
using namespace std;
vector對象的定義和初始化
定義vector對象的常用方法
//T為容納的數據類型
vector<T> v1; //v1是一個空的vector,它容納的元素是T類型的,執行預設初始化
vector<T> v2(v1); //用v1拷貝構造v2
vector<T> v2 = v1; //與上一句等價
vector<T> v3(n,val); //v3包含n個重覆元素,每個元素的值都是val
vector<T> v4(n); //v4包含n個重覆執行了值初始化的對象
vector<T> v5{a,b,c}; //v5包含了初始值個數的元素,每個元素都賦予了對應的初始值
vector<T> v5 = {a,b,c}; //與上一句等價
其他定義vector對象的方法
//用數組初始化vector
int array[]={1,2,3,4,5,6};
vector<int> v1(array,array+6);
//用memset初始化vector
vector<int> v2;
memset(v2.data(),0,v2.size()*sizeof(int));
向vector對象中添加元素
//用成員函數push_back()在尾部添加元素
vector<int> v{1,2,3,4,5,6};
v.push_back(7);
這樣的操作有點類似於棧結構的入棧操作。
不可避免的,如果vector空間已滿,那麼元素會如何添加進去呢?
這就涉及到了vector的動態變化機制,之後的文章會進行詳細解釋。
vector的其他操作
vector<int> v,v1,v2;
//基本操作
v.[n]; //對下標進行索引
v1 = v2; //用v2中元素的拷貝替換v1中的元素
v1 = {1,2,3,4,5,6}; //用列表中元素的拷貝替換v1中的元素
v1 == v2; //v1和v2相等當且僅當他們的元素數量相同且對應位置的元素值都相等
v1 != v2;
//
v.empty(); //如果v不含任何元素,返回真;否則返回假
v.size(); //返回v中元素的個數
v.capacity(); //返回v的容量大小
v.pop_back(); //刪除v的最後一個元素
v.clear(); //清空v中的所有元素
v.resize(n); //重新指定v的容量為n
v.reserve(n); //重新指定v的容量為n(如果n不小於當前容量大小)
v1.swap(v2); //交換v1和v2的所有元素
swap(v1,v2); //同上
tip:
註意size()和capacity()函數的區別,前者返回的是已經容納的元素的個數,後者是實際能夠容納多少個元素,通過監視後者值的變化我們可以瞭解push_back()時容量是如何動態變化的。
常見錯誤
1.類中的vector
在用帶參構造函數對vector進行定義時,可能會出現如下錯誤(在結構體中這樣定義vector也會出現類似報錯)
class A
{
private:
vector<int> _data_1(2); //報錯:應輸入類型說明符
vector<int> _data_2(2,0); //報錯:應輸入類型說明符
};
原因在於
vector是封裝的類,在一個類中定義另一個類時,會出現這樣的報錯。
這裡在一個類中定義vector的時候同時調用了vector的帶參構造函數進行直接初始化。
解決方案
我們可以將vector的初始化放到構造函數中
class A
{
private:
vector<int> _data_1;
vector<int> _data_2;
public:
A():_data_1(2),_data_2(2,0){}
}
既然不能使用直接初始化,我們可以使用拷貝式初始化
class A
{
private:
vector<int> _data_1{0,0};
vector<int> _data_2 = {0,0};
}
參考書籍
C++ Primer 中文版(第五版)
本文來自博客園,作者:Vergissmeinnicht_z,轉載請註明原文鏈接:https://www.cnblogs.com/Vergissmeinnicht-rj/p/16356252.html