STL標準模板庫之vector

STL提供了一組表示容器、迭代器、函數對象和算法的模板。數組

  • 容器是一個與數組相似的單元,能夠存儲若干個值。STL容器是同質的,即存儲的值的類型相同;
  • 算法是完成特定任務(如對數組進行排序或在鏈表中查找特定值)的處方;
  • 迭代器可以用來遍歷容器的對象,與可以遍歷數組的指針相似,是廣義指針;
  • 函數對象是相似於函數的對象,能夠是類對象或函數指針(包括函數名,由於函數名被用做指針)。

STL使得可以構造各類容器(包括數組、隊列和鏈表)和執行各類操做(包括搜索、排序和隨機排列)函數

接下來介紹幾種ACMer必須掌握的幾個成員指針

vector容器

1)什麼是vector

向量(Vector)是一個封裝了動態大小數組的順序容器(Sequence Container)。跟任意其它類型容器同樣,它可以存放各類類型的對象。能夠簡單的認爲,向量是一個可以存聽任意類型的動態數組。code

通常來講數組不能動態拓展,所以在程序運行的時候不是浪費內存,就是形成越界。而vector正好彌補了這個缺陷,它的特徵是至關於可分配拓展的數組(動態數組),它的隨機訪問快,在中間插入和刪除慢,但在末端插入和刪除快。orm

2)如何定義

//頭文件必須包含:
#include<vector>
//定義一個vector,int爲數組元素的數據類型,test1爲動態數組名
vector<int>test1;
//定義一個元素爲結構體型的vector
vector<information>test2
//定義一個迭代器
vector<int>::iterator it;

vector的初始化能夠有不少種方式:對象

//定義10個整型元素的向量(尖括號中爲元素類型名,它能夠是任何合法的數據類型),但沒有給出初值,其值是不肯定的。
① vector<int> a(10);
//定義了10個整型元素的向量,且給出每一個元素的初值爲1
② vector<int> a(10,1); 
//用b向量來建立a向量,總體複製性賦值
③ vector<int> a(b); 
//定義了a值爲b中第0個到第2個(共3個)元素
④ vector<int> a(b.begin(),b.begin+3);
//從數組中得到初值
⑤ int b[7]={1,2,3,4,5,9,8};
  vector<int> a(b,b+7);

3)經常使用的Vector函數

一、容量函數

  • 容器大小:a.size();//返回a中元素個數排序

  • 容器容量:a.capacity();//預分配的內存空間與size不一樣,返回a在內存中總共能夠容納的元素個數隊列

  • 容器判空:a.empty();//空則返回true,不然返回false內存

  • 更改容器大小:a.resize(num);a.resize(num,value);

a.resize(10); //將a的現有元素個數調至10個,多則刪,少則補,其值隨機
a.resize(10,2); //將a的現有元素個數調至10個,多則刪,少則補,其值爲2

二、增長函數

  • 將區間[first,end)中的數據賦值給a (注意區間的開閉):a.assign(first,end)

  • a只含n個元素,且每一個元素爲elem:a.assign(n,elem)

a.assign(b.begin(), b.begin()+3); //b爲向量,將b的0~2個元素構成的向量賦給a
a.assign(4,2);//a只含4個元素,且每一個元素爲2
  • 末尾添加元素:a.push_back(value) //在a的最後一個向量後插入一個元素,其值爲value
  • 任意位置插入一個元素:a.insert(location,value)//在a的第location的位置插入value
  • 任意位置插入num個相同的元素:a.insert(location,num,value)//在a的第location的位置插入num個值爲value的數
  • 插入另外一個向量的[first,end)間的數據:a.insert(location,first,end)
//假設 a:5 7 3 1 4;b: 2 3 4 5 6 7 8
a.push_back(2);//a:5 7 3 1 4 2
a.insert(a.begin()+1,2);//a:5 2 7 3 1 4
a.insert(a.begin()+1,2,3);//a:5 3 3 7 3 1 4
a.insert(a.begin()+1,b.begin()+2,b.begin()+5);//a:5 4 5 6 7 3 1 4

三、刪除函數

  • 頭部刪除元素:a.pop_front();
  • 末尾刪除元素: a.pop_back();
  • 刪除[first,end)之間的元素: a.erase(first, end);
  • 清空全部元素: a.clear();
a.erase(a.begin()+1,a.begin()+3); //刪除a中第1個(從第0個算起)到第2個元素,也就是說刪除的元素從a.begin()+1算起(包括它)一直到a.begin()+3(不包括它)

四、迭代器

  • 開始指針:a.begin();
  • 末尾指針:a.end();//指向最後一個元素的下一個位置

五、訪問函數

  • 返回a的第一個元素:a.front();
  • 返回a的最後一個元素:a.back();
  • 下標訪問:a[1];//並不會檢查是否越界
  • at方法訪問:a.at(1);//會檢查越界,若越界則拋出out of range異常

六、其餘函數及操做

  • 交換函數:a.swap(b);//b也爲向量,將a中的元素和b中的元素進行總體交換
  • 比較操做:a==b;//b也爲向量,向量的比較還有!=,>=,<=,>,<

七、算法

須要包含頭文件:

#include<algorithm>
(1)sort(a.begin(),a.end()); //對a中的從a.begin()(包括它)到a.end()(不包括它)的元素進行從小到大排列
(2)reverse(a.begin(),a.end()); //對a中的從a.begin()(包括它)到a.end()(不包括它)的元素倒置,但不排列,如a中元素爲1,3,2,4,倒置後爲4,2,3,1
(3)copy(a.begin(),a.end(),b.begin()+1); //把a中的從a.begin()(包括它)到a.end()(不包括它)的元素複製到b中,從b.begin()+1的位置(包括它)開始複製,覆蓋掉原有元素
(4)find(a.begin(),a.end(),10); //在a中的從a.begin()(包括它)到a.end()(不包括它)的元素中查找10,若存在返回其在向量中的位置
相關文章
相關標籤/搜索