首先說明, stl 是一個很龐大的系統庫, 包含 容器, 算法, 迭代器 , 仿函數, 適配器
其實在上面的幾個部分, 我們最關心的應該是 容器, 和迭代器了吧
參考: https://www.nhooo.com/cpp/cpp-stl-tutorial.html
容器
組成部分
分為向量(vector),雙向隊列(deque),表(list),隊列(queue),堆棧(stack),集合(set),多重集合(multiset),映射(map),多重映射(multimap)
容器共同的函數
大小相關:
size(), 大小
empty(), 是否空
max_size() 最大容量迭代器相關
begin(),end(), 從頭開始
rbegin(),rend() 從尾開始比較操作
==,!=,<,>,>=
容器 算法 迭代器
vector
向量(Vector)和數組(array)之間的區別
array 不能動態修改大小,vector 可以在運行時動態擴展大小
創建格式
#include <vector>
vector<object_type> v1;
實例
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<string> v1;
v1.push_back("nhooo");
v1.push_back(".com");
for(vector<string>::iterator itr=v1.begin();itr!=v1.end();++itr){
cout<<*itr;
}
return 0;
}
訪問的話,可以使用迭代器,索引或者 at 函數
- 操作函數
at(index) 返回索引處的元素, 越界報錯
vector<object_type> v;
v.at(k) ;
back() 返回最后一個元素的引用
vector<string> fruit{"mango","apple","banana"};
cout<<fruit.back();
> "banana"
- front() 返回第一個元素
vector<string> language{"java","C","C++"};
cout<<language.front();
- 交換兩個向量
v1.swap(v2);
- 最后添加元素
v.push_back(k)
- 刪除最后的元素
v.pop_back();
- 判斷vector 是不是空的
bool v.empty()
- 指定位置插入元素
insert(iterator,val);
insert(iterator,n,val);
insert(iterator,InputIterator first,InputIterator last);
iterator:迭代器定義位置,將在其中插入新元素。
val:val是指定要插入的值。
n:該值出現的次數。
(first,last):它定義了要插入的元素范圍。
實例:
vector<int> v{1,2,3,4,5};
vector<int> v1{6,7,8,9,10};
v.insert(v.end(),v1.begin(),v1.begin()+5);
for(int i=0;i<v.size();i++)
cout<<v[i]<<" ";
> 1 2 3 4 5 6 7 8 9 10
- 刪除指定元素
v.erase(pos);
v.erase(start_iterator,end_iterator);
pos:它定義要從向量(vector)中刪除的元素的位置。
(start_iterator,end_iterator):它定義要從向量(vector)中刪除的元素的范圍。
vector<string> fruit{ "芒果", "蘋果", "草莓", "獼猴桃", "香蕉" };
fruit.erase(fruit.begin() + 1, fruit.begin() + 3);
> fruit : 芒果 獼猴桃 香蕉
- 修改向量大小,截取或元素填充
v.resize(n,val);
n:這是新的向量(vector)大小。
val:如果n大于當前向量(vector)大小,則將value(val)插入添加的空間中。
如果 n 小于當前長度,則截取前 n 個元素
vector<string> v1{"java","C","C++"};
v1.resize(5,".Net");
>v1: java C C++ java C C++ .Net .Net
- 清空元素
v.clear();
- 獲取元素數量
int n=v.size();
- 向量容量 >= size() 返回的數
int c=v.capacity();
- 批量賦值元素
v.assign(first,last);
v.assign(n,val);
(first,last):它定義了范圍。將區間(first,last)的元素賦值到當前的vector容器中。
n:出現值的次數。
val:它定義要分配的值。
vector<int> v{1,2,3,4,5};
vector<int> v1;
v1.assign(v.begin()+1,v.end()-1);
v1: 2 3 4
vector<char> v;
v.assign(5,'C');
>v: CCCCC
- 迭代器位置
iterator it=v.end()
iterator it=v.begin()
更多函數
image.png
image.png
list
List是連續的容器,而vector是非連續的容器
列表中遍歷速度很慢,因為列表元素是按順序訪問的,而vector支持隨機訪問
list<int> l;
list<int> new_list{1,2,3,4};
or
list<int> new_list = {1,2,3,4};
- insert
iterator insert( iterator pos, const value_type value);
void insert( iterator pos, int n, const value_type value);
void insert( iterator pos, InputIterator first, InputIterator last);
更多方法:
image.png
- 隊列
queue
和其他類型不同的是, queue 是先進先出的結構。
template<class T, class Container = deque<T> > class queue;
方法:
empty
size
front 取出第一個元素
back 取出最后一個元素
push 末尾新增元素
pop 刪除第一個元素
queue <int> fquiz;
fquiz.push(10);
fquiz.push(20);
fquiz.push(30);
cout << "隊列fquiz是 : ";
showsg(fquiz);
cout << "\nfquiz.size() : " << fquiz.size();
cout << "\nfquiz.front() : " << fquiz.front();
cout << "\nfquiz.back() : " << fquiz.back();
map
typedef pair<const Key, T> value_type;
- 添加數據
mapPerson.insert(pair < int,string > (1,"Jim"));
mapStudent.insert(map<int, string>::value_type (1, "student_one"));
mapPerson[1] = "xxxx"
不同的是 [] 這種添加數據, 會覆蓋相同的key, 二 insert 如果有相同的 key 存在,則不會新增成功
pair<map<int, string>::iterator, bool> Insert_Pair;
Insert_Pair = mapStudent.insert(map<int, string>::value_type (1, "student_one"));
if(Insert_Pair.second == true)
cout<<"Insert Successfully"<<endl;
- map 大小
Int nSize = mapStudent.size();
- map 遍歷
for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
cout<<iter->first<<' '<<iter->second<<endl;
first 是 key second 是 value
for(int nindex = 1; nindex <= nSize; nindex++)
cout<<mapStudent[nindex]<<endl;
>> 注意 index 是從 1 開始
- map 取值
map<int, string>::iterator iter;
iter = mapStudent.find(1);
if(iter != mapStudent.end()) ;
cout<<"Find, the value is "<<iter->second<<endl;
- map 刪除元素
erase() 參數可以是 一個 iterator, 也可以是兩個 iterator (這個范圍全部刪除) 或者是一個具體的key
map<int, string>::iterator iter;
iter = mapStudent.find(1);
mapStudent.erase(iter);
int n = mapStudent.erase(1);//如果刪除了會返回1,否則返回0