c++類庫stl
把c++視訊全部又看了一遍,總結了stl類庫
總結如下:
vector:
vector向量中,可以用[x][y]表示第x-1位裡的第y-1個元素;
s[i] // 直接以下標方式訪問容器中的元素
s.front() // 返回首元素
s.back() // 返回尾元素
s.push_back(x) // 向表尾插入元素x
s.size() // 返回表長
s.empty() // 表為空時,返回真,否則返回假
s.pop_back() // 刪除表尾元素
s.begin() // 返回指向首元素的隨機存取迭代器
s.end() // 返回指向尾元素的下一個位置的隨機存取迭代器
s.insert(it, val) // 向迭代器it指向的元素前插入新元素val
s.insert(it, n, val)// 向迭代器it指向的元素前插入n個新元素val
s.insert(it, first, last) // 將由迭代器first和last所指定的序列[first, last)插入到迭代器it指向的元素前面
s.erase(it) // 刪除由迭代器it所指向的元素 s.erase(first, last)// 刪除由迭代器first和last所指定的序列[first, last) s.reserve(n) // 預分配緩衝空間,使儲存空間至少可容納n個元素
s.resize(n) // 改變序列長度,超出的元素將會全部被刪除,如果序列需要擴充套件(原空間小於n),元素預設值將填滿擴展出的空間 s.resize(n, val) // 改變序列長度,超出的元素將會全部被刪除,如果序列需要擴充套件(原空間小於n),val將填滿擴展出的空間 s.clear() // 刪除容器中的所有元素
s.swap(v) // 將s與另一個vector物件進行交換
deque//雙向動態陣列
deque 可以在陣列的開頭和末尾插入和刪除資料
a.push_back(x) 陣列後面加資料
a.push_front(y)陣列前面加資料
a.pop_back()陣列後面依次刪除資料
a.pop_front()陣列前面依次刪除
deque迭代器
deque<int>::itreator x
size_t n=distance(a.begin(),x(迭代器名))//algorithm演算法distance()
list雙向連結串列 連結串列沒有下標,只能用迭代器,不能用陣列迴圈輸入或輸出連結串列中的資料//插入刪除資料時比vector速度快
可以在list開頭插入元素
可以在list末尾插入元素
可以在list中間插入元素
刪除list中的元素
元素進行反轉和排序
a.push_front(x) 在連結串列前面加入資料//從前往後排序,先插入的在後面
a.front()//連結串列前面第一個的元素
a.back()//連結串列最後一個的元素
a.push_back(x) 連結串列後面加資料//輸入資料速度很快//vector速度慢,因為擴大陣列時是先建立一個新陣列,然後再複製到新數組裡
a.push_front(y)連結串列前面加資料
a.pop_back()連結串列後面依次刪除資料
a.pop_front()連結串列前面依次刪除
a.insert(a.begin(),10)//在開頭的前面插入10;a.begin為迭代器
a.insert(a.end(),4,20)//在後端插入4個20//a.end()為迭代器
a.insert(a.begin(),b.begin(),b.end())//將b全部插入A的前面,換成b.end()則插入a後面,
a.insert(a.begin(),++b.begin(),b.end())
a.erase(迭代器)//刪除迭代器
a.erase(x,y)//從X刪除y,包括x,不包括y
list 反轉和排序
a.reverse();//連結串列反轉
a.sort();//連結串列排序,從小到大
stl stack 堆疊後進先出,後進先出 無迭代器,只能在末端操作資料
自適應容器(容器介面卡)
棧介面卡//定義堆疊
stack< int,deque<int> > a;
stack< int,vector<int> > b;
stack< int,list<int> > c;
stack<int> d;
a.empty();//檢查堆疊是否為空
a.size();//檢查堆疊的大小
a.pop();//彈出資料
a.top();//檢視棧頂資料,不刪除
a.push(x);//把x壓入堆疊
stl queue 佇列 先進先出,要求兩端都能操作,所以不能建立vector佇列 ;
插入只能在隊尾,彈出只能是隊首 無迭代器,所以只能在兩端操作資料,不能在中間插入或者刪除元素
棧介面卡
q.empty();//檢查佇列是否為空
q.size();//檢查佇列的大小
q.front();//檢視隊首的資料,並不刪除
q.back();//檢視隊尾資料,並不刪除
q.push(x);從對首到隊尾依次新增元素
q.pop();//只能在隊首依次刪除;
stl 優先順序佇列 priority_queue 不能使用list
分為 :最大值優先順序佇列,最小優先順序佇列
a.push(x);//插入元素,按降序或升序
a.top();//檢視優先順序佇列首元素
a.pop();//刪除優先順序佇列首元素
a.empty();//判斷是否為空
a.size();//求優先順序佇列大小
priority_queue<int> a;//最大值優先順序佇列
priority_queue<int,greater<int>() > a;//最小值優先順序佇列
bitset
在 STL
的標頭檔案中 <bitset> 中定義了模版類 bitset,用來方便地管理一系列的 bit 位的類。bitset 除了可以訪問指定下標的 bit
位以外,還可以把它們作為一個整數來進行某些統計。
bitset
模板類需要一個模版引數,用來明確指定含有多少位。
bt.any() // bt 中是否存在置為 1 的二進位制位?
bt.none() // bt 中不存在置為 1 的二進位制位嗎?
bt.count() // bt 中置為 1 的二進位制位的個數
bt.size() // bt 中二進位制位的個數
bt[pos] // 訪問 bt 中在 pos 處的二進位制位
bt.test(pos) // bt 中在 pos 處的二進位制位是否為 1
bt.set() // 把 bt 中所有二進位制位都置為 1
bt.set(pos) // 把 bt 中在 pos 處的二進位制位置為 1
bt.reset() // 把 bt 中所有二進位制位都置為 0
bt.reset(pos) // 把 bt 中在pos處的二進位制位置為0
bt.flip() // 把 bt 中所有二進位制位逐位取反
bt.flip(pos) // 把 bt 中在 pos 處的二進位制位取反
bt[pos].flip() // 同上
bt.to_ulong() // 用 bt 中同樣的二進位制位返回一個 unsigned long 值
os << bt // 把 bt 中的位集輸出到 os 流
迭代器
常用的迭代器操作:*iter ++iter --iter iter1==iter2 iter1!=iter2
vector deque
iter+n iter-n > >=
迭代器範圍
begin/end //end()是指向最後一個的下一個地址 first/last
順序容器: vector list deque
vector<int>::size_type a1;//陣列迴圈時,定義i的型別.用於陣列中資料較多時
vector<int>::iterator a2;
vector<int>::const_iterator a3;
vector<int>::reverse_iterator a4;//逆序迭代器,rbegin(),rend();
vector<int>::const_reverse_iterator a5;
vector<int>::difference_type a6;
vector<int>::value_type a7;
vector<int>::reference a8;
vector<int>::const_reference a9;
a.size() 返回型別是 size_type
a.max_size()//返回這個容器能容納的最大數量 返回型別 size_type
a.resize(x)或a.resize(x,y)表示新增x個y//調整容器大小
刪除元素:
a.erase(x)//第x個元素
a.erase(x,y)//刪除x-y,包括x,不包括y
a.clear()//全部刪除
a.swap(b)//a向量陣列與b向量陣列交換
a.assign(c.begin(),c.end())//將c的begin()到c的end()賦值a,begin不一定是陣列開始的位置
a.reserve(x)//增大陣列容量至x
a.capacity()//測量陣列的容量
向量陣列排序快
向量陣列二分查詢 binary_search(a.begin(),a.end(),x)//在陣列中找x
只適合string型別的操作
s.substr(x,y):從字串中的第x到y的所有元素
s.substr(x);x以後的所有元素
s.substr():s中的所有字串
s.append("x"):在最後新增字串x=s.insert(s.end(),"x")
replace(x,y,"z"):從x到y換成z
set:
set(集)//不能放入重複的資料//與multiset//資料可以重複//插入後會排好序
插入:a.insert(x);
支援find()和erase();
if(a.find(x)==a.end())//判斷x是否在a中
set清除資料可以用a.clear();
set<int> a;
set<double> ss;
a.insert(x);//將x插入陣列a中,插入結束後,a中陣列已經排好序
s.begin() // 返回指向第一個元素的迭代器
s.clear() // 清除所有元素
s.count() // 返回某個值元素的個數
s.empty() // 如果集合為空,返回true(真)
s.end() // 返回指向最後一個元素之後的迭代器,不是最後一個元素
s.equal_range() // 返回集合中與給定值相等的上下限的兩個迭代器
s.erase() // 刪除集合中的元素
s.find() // 返回一個指向被查詢到元素的迭代器
s.get_allocator() // 返回集合的分配器
s.insert() // 在集合中插入元素
s.lower_bound() // 返回指向大於(或等於)某值的第一個元素的迭代器
s.key_comp() // 返回一個用於元素間值比較的函式
s.max_size() // 返回集合能容納的元素的最大限值
s.rbegin() // 返回指向集合中最後一個元素的反向迭代器
s.rend() // 返回指向集合中第一個元素的反向迭代器
s.size() // 集合中元素的數目
s.swap() // 交換兩個集合變數
s.upper_bound() // 返回大於某個值元素的迭代器
s.value_comp() // 返回一個用於比較元素間的值的函式
對映:map//插入資料後也是自動按字典順序排列 二叉樹,紅黑樹
map就是從鍵(key,不可以重複)到值(value)的對映。因為過載了[ ]運算子,map像是陣列的“高 級版”。例如可以用一個map<string,int>month_name來表示“月份名字到月份編號”的對映, 然後用month_name["July"]=7這樣的方式來賦值。
map插入方法:1: a.insert(map<int,string>::value_type(x,"y"));
2:a.insert(make_pair(x,"y"));
3:a.insert(pair<int,string>(x,"y"));
4:a[x]="y";
輸出 鍵 a->first 鍵值 a->second.c_str;
查詢:cout<<a[x]//直接輸出x對應的值
multimap鍵值可以重複
插入方法:
1: a.insert(multimap<int,string>::value_type(x,"y"));
2:a.insert(make_pair(x,"y"));
3:a.insert(pair<int,string>(x,"y"));
multimap的查詢
multimap<int,string>::iterator fi;
fi=a.find(x)//查詢x
cout<<fi->first<<fi->second.c_str()<<endl;
a.count(x)統計multimap中x的個數
刪除:
1:ma.erase(x);//x為鍵
2:ma.erase(ma.lower_bound(x),ma.upper_bound(x));//刪除一個範圍
stl演算法
標頭檔案
#include<algorithm>
#include<numeric>//數值演算法
#include<functional>//函式介面卡
預定義的函式物件
negate<type>()
plus<type>()
minus<type>()
greater<type>//從大到小
less<type>//從小到大
for_each(v.begin(),v.end(),函式預定義);//對兩個迭代器內的資料進行
預定義的函式介面卡
int visit(int v) // 遍歷運算元函式
{
cout << v << " ";
return 1;
}
for_each(L.begin(), L.end(), visit);
min_element/max_element找出容器中的最小/最大值//
vector<int>::iterator min_it = min_element(L.begin(), L.end());
vector<int>::iterator max_it = max_element(L.begin(), L.end());
copy在容器間複製元素
copy(vOne.begin(), vOne.begin() + 3, vTwo.begin() + 4);
元素計數演算法
count(a.begin(),a.end(),x)
最大值和最小值
min_element(b,e)//迭代器b到迭代器e之間//返回值是一個迭代器 輸出時:cout<<*min_element
max_element(b,e)//同上
查詢演算法:
find() //返回是所在位置的地址的迭代器
find_if() //
search_n(b,e,c,v)//找連續的數