[TOC] STL提供了一組表示容器、迭代器、函數對象和演算法的模板。 + 容器是一個與數組類似的單元,可以存儲若幹個值。STL容器是同質的,即存儲的值的類型相同; + 演算法是完成特定任務(如對數組進行排序或在鏈表中查找特定值)的處方; + 迭代器能夠用來遍歷容器的對象,與能夠遍曆數組的指針類似,是廣 ...
目錄
STL提供了一組表示容器、迭代器、函數對象和演算法的模板。
- 容器是一個與數組類似的單元,可以存儲若幹個值。STL容器是同質的,即存儲的值的類型相同;
- 演算法是完成特定任務(如對數組進行排序或在鏈表中查找特定值)的處方;
- 迭代器能夠用來遍歷容器的對象,與能夠遍曆數組的指針類似,是廣義指針;
- 函數對象是類似於函數的對象,可以是類對象或函數指針(包括函數名,因為函數名被用作指針)。
STL使得能夠構造各種容器(包括數組、隊列和鏈表)和執行各種操作(包括搜索、排序和隨機排列)
接下來介紹幾種ACMer必須掌握的幾個成員
vector容器
1)什麼是vector
向量(Vector)是一個封裝了動態大小數組的順序容器(Sequence Container)。跟任意其它類型容器一樣,它能夠存放各種類型的對象。可以簡單的認為,向量是一個能夠存放任意類型的動態數組。
一般來說數組不能動態拓展,因此在程式運行的時候不是浪費記憶體,就是造成越界。而vector正好彌補了這個缺陷,它的特征是相當於可分配拓展的數組(動態數組),它的隨機訪問快,在中間插入和刪除慢,但在末端插入和刪除快。
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函數
1、容量函數
容器大小: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
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
3、刪除函數
- 頭部刪除元素:a.pop_front();
- 末尾刪除元素: a.pop_back();
- 任意位置刪除一個元素: a.erase(location);
- 刪除[first,end)之間的元素: a.erase(first, end);
- 清空所有元素: a.clear();
4、迭代器
- 開始指針:a.begin();
- 末尾指針:a.end();//指向最後一個元素的下一個位置
5、訪問函數
- 返回a的第一個元素:a.front();
- 返回a的最後一個元素:a.back();
- 下標訪問:a[1];//並不會檢查是否越界
- at方法訪問:a.at(1);//會檢查越界,若越界則拋出out of range異常
6、其他函數及操作
- 交換函數:a.swap(b);//b也為向量,將a中的元素和b中的元素進行整體交換
- 比較操作:a==b;//b也為向量,向量的比較還有!=,>=,<=,>,<
7、演算法
需要包含頭文件:
#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,若存在返回其在向量中的位置