算法训练之STL使用汇总
STL使用匯總
- vector
- vector常用函數(shù)
- vector 創(chuàng)建二維數(shù)組
- list
- list常用函數(shù)
- 遍歷list
- erase
- insert
- splice
- queue
- 常用函數(shù)
- priority_queue
- priority_queue常用函數(shù)
- 大根堆,小根堆
- set
- set常用函數(shù)
- find()
- erase()
- set取并集,交集,差集
- set_union
- set_intersection
- set_difference
- 注意事項(xiàng)
- bitset
- 1、構(gòu)造函數(shù):
- 2、常用操作:
- string
- 數(shù)字的字典序比較
- map
- map的基本操作函數(shù)
- erase() 刪除元素
- 注意事項(xiàng)
- multimap
- 訪問(wèn)元素
- 單個(gè)find()
- equal_range
- insert()
- reverse
- rotate
- 全排列函數(shù)
- includes(子集)
- 二分查找
- 1.binary_search()(查找某個(gè)值在數(shù)組中是否存在)
- 2. lower_bound查找第一個(gè)大于或等于某個(gè)元素的位置
- 3.upper_bound查找第一個(gè)大于某個(gè)元素的位置。
vector
vector常用函數(shù)
#include<vector> vector<int> a,b; //b為向量,將b的0-2個(gè)元素賦值給向量a a.assign(b.begin(),b.begin()+3); //a含有4個(gè)值為2的元素 a.assign(4,2); //返回a的最后一個(gè)元素 a.back(); //返回a的第一個(gè)元素 a.front(); //返回a的第i元素,當(dāng)且僅當(dāng)a存在 a[i]; //清空a中的元素 a.clear(); //判斷a是否為空,空則返回true,非空則返回false a.empty(); //刪除a向量的最后一個(gè)元素 a.pop_back(); //刪除a中第一個(gè)(從第0個(gè)算起)到第二個(gè)元素,也就是說(shuō)刪除的元素從a.begin()+1算起(包括它)一直到a.begin()+3(不包括它)結(jié)束 a.erase(a.begin()+1,a.begin()+3); //在a的最后一個(gè)向量后插入一個(gè)元素,其值為5 a.push_back(5); //在a的第一個(gè)元素(從第0個(gè)算起)位置插入數(shù)值5, a.insert(a.begin()+1,5); //在a的第一個(gè)元素(從第0個(gè)算起)位置插入3個(gè)數(shù),其值都為5 a.insert(a.begin()+1,3,5); //b為數(shù)組,在a的第一個(gè)元素(從第0個(gè)元素算起)的位置插入b的第三個(gè)元素到第5個(gè)元素(不包括b+6) a.insert(a.begin()+1,b+3,b+6); //返回a中元素的個(gè)數(shù) a.size(); //返回a在內(nèi)存中總共可以容納的元素個(gè)數(shù) a.capacity(); //將a的現(xiàn)有元素個(gè)數(shù)調(diào)整至10個(gè),多則刪,少則補(bǔ),其值隨機(jī) a.resize(10); //將a的現(xiàn)有元素個(gè)數(shù)調(diào)整至10個(gè),多則刪,少則補(bǔ),其值為2 a.resize(10,2); //將a的容量擴(kuò)充至100, a.reserve(100); //b為向量,將a中的元素和b中的元素整體交換 a.swap(b); //b為向量,向量的比較操作還有 != >= > <= < a==b;vector 創(chuàng)建二維數(shù)組
創(chuàng)建
vector<vector<int>>ans; //不過(guò)這個(gè)時(shí)候ans 大小是0,不能訪問(wèn)。初始化
// 創(chuàng)建有n行 vector<vector<int>>ans(N); //n*m,并初始化為0 vector<vector<int>>ans(N,vector<int>(m,0));例子
int main() {while(cin>>n>>q){vector<vector<int>>ans(N);while(q--){cin>>fg;if(fg == 0){cin>>t>>x;ans[t].push_back(x);}else if(fg == 1){cin>>t;show(ans[t]);}else{cin>>t;ans[t].clear();}}}return 0; }list
list常用函數(shù)
Lst1.assign() 給list賦值
Lst1.back() 返回最后一個(gè)元素
Lst1.begin() 返回指向第一個(gè)元素的迭代器
Lst1.clear() 刪除所有元素
Lst1.empty() 如果list是空的則返回true
Lst1.end() 返回末尾的迭代器
Lst1.erase() 刪除一個(gè)元素
Lst1.front() 返回第一個(gè)元素
Lst1.get_allocator() 返回list的配置器
Lst1.insert() 插入一個(gè)元素到list中
Lst1.max_size() 返回list能容納的最大元素?cái)?shù)量
Lst1.merge() 合并兩個(gè)list
Lst1.pop_back() 刪除最后一個(gè)元素
Lst1.pop_front() 刪除第一個(gè)元素
Lst1.push_back() 在list的末尾添加一個(gè)元素
Lst1.push_front() 在list的頭部添加一個(gè)元素
Lst1.rbegin() 返回指向第一個(gè)元素的逆向迭代器
Lst1.remove() 從list刪除元素
Lst1.remove_if() 按指定條件刪除元素
Lst1.rend() 指向list末尾的逆向迭代器
Lst1.resize() 改變list的大小
Lst1.reverse() 把list的元素倒轉(zhuǎn)
Lst1.size() 返回list中的元素個(gè)數(shù)
Lst1.sort() 給list排序
Lst1.splice() 合并兩個(gè)list
Lst1.swap() 交換兩個(gè)list
Lst1.unique() 刪除list中重復(fù)的元素
遍歷list
第一種
for(auto it = L.begin();it!=L.end();it++)cout<<*it<<endl;第二種
for (auto e:L) {cout << e << endl;//auto循環(huán)更方便}erase
erase 是刪除之后會(huì)返回下一個(gè)位置。
如
cur = L.erase(cur); //會(huì)講 cur位置的元素刪除掉,然后返回下一個(gè)位置的迭代器insert
insert插入的是在當(dāng)前位置的前一個(gè)位置,同時(shí)插入后返回插入位置的迭代器。
如
splice
作用是將另一個(gè)list中的元素復(fù)制
ans[t].splice(ans[t].end(),ans[s]);queue
常用函數(shù)
1.入隊(duì):如q.push(x):將x元素接到隊(duì)列的末端;2.出隊(duì):如q.pop() 彈出隊(duì)列的第一個(gè)元素,并不會(huì)返回元素的值;3,訪問(wèn)隊(duì)首元素:如q.front()4,訪問(wèn)隊(duì)尾元素,如q.back();5,訪問(wèn)隊(duì)中的元素個(gè)數(shù),如q.size();priority_queue
priority_queue常用函數(shù)
top 訪問(wèn)隊(duì)頭元素 empty 隊(duì)列是否為空 size 返回隊(duì)列內(nèi)元素個(gè)數(shù) push 插入元素到隊(duì)尾 (并排序) emplace 原地構(gòu)造一個(gè)元素并插入隊(duì)列 pop 彈出隊(duì)頭元素 swap 交換內(nèi)容大根堆,小根堆
默認(rèn)是大頂堆
一般是://升序隊(duì)列 priority_queue <int,vector<int>,greater<int> > q;//大根堆 //降序隊(duì)列 priority_queue <int,vector<int>,less<int> >q; //小根堆// 也可以通過(guò)重載運(yùn)算符來(lái)得到想要的根堆。
set
set常用函數(shù)
有一個(gè)multiset 是它的兄弟,區(qū)別是里邊的元素可以是重復(fù)的,在函數(shù)使用上基本上是一樣的,如erase,set刪除的是單個(gè),multiset 刪除的是所有相同的。
begin(); // 返回指向第一個(gè)元素的迭代器 end(); // 返回指向迭代器的最末尾處(即最后一個(gè)元素的下一個(gè)位置) clear(); // 清除所有元素 count(); // 返回某個(gè)值元素的個(gè)數(shù)empty(); // 如果集合為空,返回trueequal_range(); //返回集合中與給定值相等的上下限的兩個(gè)迭代器erase()–刪除集合中的元素find()–返回一個(gè)指向被查找到元素的迭代器get_allocator()–返回集合的分配器insert()–在集合中插入元素lower_bound()–返回指向大于(或等于)某值的第一個(gè)元素的迭代器key_comp()–返回一個(gè)用于元素間值比較的函數(shù)max_size()–返回集合能容納的元素的最大限值rbegin()–返回指向集合中最后一個(gè)元素的反向迭代器rend()–返回指向集合中第一個(gè)元素的反向迭代器size()–集合中元素的數(shù)目swap()–交換兩個(gè)集合變量upper_bound()–返回大于某個(gè)值元素的迭代器value_comp()–返回一個(gè)用于比較元素間的值的函數(shù)find()
find()返回的是一個(gè)迭代器位置,如果沒(méi)有找到則是end()
auto it = ans.find(n);if(it!=ans.end())cout<<1<<endl;elsecout<<0<<endl;erase()
erase() 先通過(guò) find()函數(shù)找到x元素的迭代器位置。如果不是end()就刪除
注意:set中的erase()無(wú)返回值。
set取并集,交集,差集
基本介紹
set里面有set_intersection(取集合交集)、set_union(取集合并集)、set_difference(取集合差集)、set_symmetric_difference(取集合對(duì)稱差集)等函數(shù)。
set_union
set_union(A.begin(),A.end(),B.begin(),B.end(),inserter(result,result.begin()));for(int i=0;i<result.size();i++){cout<<result[i]<<" ";}set_intersection
set_intersection(A.begin(),A.end(),B.begin(),B.end(),inserter(result,result.begin()));for(int i=0;i<result.size();i++){cout<<result[i]<<" ";}set_difference
set_difference(A.begin(),A.end(),B.begin(),B.end(),inserter(result,result.begin()));for(int i=0;i<result.size();i++){cout<<result[i]<<" ";}注意事項(xiàng)
與 map/multimap 不同的是,map/multimap中存儲(chǔ)的是真正的鍵值對(duì)<key,value>,set 中只放 value,但與底層實(shí)際存放的是由<value,value>構(gòu)成的鍵值對(duì);
set中插入元素時(shí),只需要插入 value 即可,不需要構(gòu)造鍵值對(duì);
set中的元素不可以重復(fù);
使用set 的迭代器遍歷 set中的元素,可以得到有序序列;
set中的元素默認(rèn)按照小于來(lái)比較
set中查找某個(gè)元素,時(shí)間復(fù)雜度為:log2N;
代碼:
int main() {while(~scanf("%d",&q)){multiset<int>ans;while(q--){scanf("%d%d",&fg,&n);if(fg == 0){ans.insert(n);int len = ans.size();printf("%d\n",len);}else if(fg == 1){int state = ans.count(n);printf("%d\n",state);}else if(fg == 2)ans.erase(n);else{int r;cin>>r;auto left = ans.lower_bound(n);while(left!=ans.end()&&*left<=r){printf("%d\n",*left);left++;}}}}return 0; }bitset
1、構(gòu)造函數(shù):
#include<bitset> std::bitset<4> foo; //創(chuàng)建一個(gè)4位的位集,每一位默認(rèn)為0 當(dāng)整數(shù)的大小小于位數(shù)時(shí),高位填充為0 std::bitset<4> foo(5); //用整數(shù)初始化 5二進(jìn)制位:101 foo值:0101 當(dāng)整數(shù)的大小超過(guò)位數(shù)時(shí),從整數(shù)二進(jìn)制的低位開(kāi)始賦值,高位被舍棄 std::bitset<4> foo(19); //用整數(shù)初始化,19二進(jìn)制位:10011 foo值:1100 std::bitset<4> foo(std:;string("0101")); //字符串初始化,字符串中必須只能含有‘0’/‘1’2、常用操作:
位運(yùn)算都可以用: 與、或、非、異或,左移,右移 foo&foo2 foo|foo2 ~foo foo^foo2 foo<<=2 foo>>=2 foo.size() 返回大小(位數(shù)) foo.count() 返回1的個(gè)數(shù) foo.any() 返回是否有1 foo.none() 返回是否沒(méi)有1 foo.set() 全都變成1 foo.set(p) 將第p + 1位變成1 foo.set(p, x) 將第p + 1位變成x foo.reset() 全都變成0 foo.reset(p) 將第p + 1位變成0 foo.flip() 全都取反 foo.flip(p) 將第p + 1位取反 foo.to_ulong() 返回它轉(zhuǎn)換為unsigned long的結(jié)果,如果超出范圍則報(bào)錯(cuò) foo.to_ullong() 返回它轉(zhuǎn)換為unsigned long long的結(jié)果,如果超出范圍則報(bào)錯(cuò) foo.to_string() 返回它轉(zhuǎn)換為string的結(jié)果 b[pos] :訪問(wèn)b中在pos處的二進(jìn)制位 b.test(pos) : b中在pos處的二進(jìn)制位是否為1? b.set(pos) 把b中在pos處的二進(jìn)制位置為1 b.reset(pos) 把b中在pos處的二進(jìn)制位置為0例子
int main() {while(~scanf("%d",&q)){bitset<64>ans(0);while(q--){scanf("%d",&fg);if(fg == 0){scanf("%d",&n);cout<<ans[n]<<endl;}else if(fg == 1){scanf("%d",&n);ans.set(n);}else if(fg == 2){scanf("%d",&n);ans.reset(n);}else if(fg == 3){scanf("%d",&n);ans.flip(n);}else if(fg == 4){if(ans.count() == 64)printf("1\n");elseprintf("0\n");}else if(fg == 5){if(ans.any())printf("1\n");elseprintf("0\n");}else if(fg == 6){if(ans.none())printf("1\n");elseprintf("0\n");}else if(fg == 7){cout<<ans.count()<<endl;}else{cout<<ans.to_ullong()<<endl;}}}return 0; }string
數(shù)字的字典序比較
難點(diǎn)是將數(shù)字轉(zhuǎn)化為字符,對(duì)于1位的加‘0’即可,但多位數(shù)的就不好處理,因此可以直接讀入字符串。
int main() {string s1,s2,s;cin>>n;for(int i=0;i<n;++i)cin>>s,s1 += s;cin>>m;for(int i=0;i<m;++i)cin>>s,s2 += s;if(s2>s1)cout<<1<<endl;elsecout<<0<<endl;return 0; }map
map的基本操作函數(shù)
C++ Maps是一種關(guān)聯(lián)式容器,包含“關(guān)鍵字/值”對(duì)begin() 返回指向map頭部的迭代器clear() 刪除所有元素count() 返回指定元素出現(xiàn)的次數(shù)empty() 如果map為空則返回trueend() 返回指向map末尾的迭代器equal_range() 返回特殊條目的迭代器對(duì)erase() 刪除一個(gè)元素find() 查找一個(gè)元素get_allocator() 返回map的配置器insert() 插入元素key_comp() 返回比較元素key的函數(shù)lower_bound() 返回鍵值>=給定元素的第一個(gè)位置max_size() 返回可以容納的最大元素個(gè)數(shù)rbegin() 返回一個(gè)指向map尾部的逆向迭代器rend() 返回一個(gè)指向map頭部的逆向迭代器size() 返回map中元素的個(gè)數(shù)swap() 交換兩個(gè)mapupper_bound() 返回鍵值>給定元素的第一個(gè)位置value_comp() 返回比較元素value的函數(shù)erase() 刪除元素
- size_t erase( const key_type& key );
根據(jù)key來(lái)進(jìn)行刪除, 返回刪除的元素?cái)?shù)量,在map里結(jié)果非0即1 - iterator erase( iterator pos )
刪除迭代器指向位置的鍵值對(duì),并返回一個(gè)指向下一元素的迭代器 - iterator erase( const_iterator first, const_iterator last );
刪除一定范圍內(nèi)的元素,并返回一個(gè)指向下一元素的迭代器
注意事項(xiàng)
- 使用insert方法插入的時(shí)候,如果鍵存在,不會(huì)覆蓋原來(lái)的值,用數(shù)組的方式才可以。
- 還有一個(gè)很重要的點(diǎn)就是,如果訪問(wèn)了一個(gè)不存在的鍵,那么會(huì)返回0之后會(huì)自動(dòng)創(chuàng)建這個(gè)鍵。
因此可以如下來(lái)解決
multimap
multimap容器保存的是有序的鍵/值對(duì),但是可以保存重復(fù)的元素。multimap中會(huì)出現(xiàn)具有相同鍵值的元素序列。multimap大部分成員函數(shù)的使用方式和map相同。因?yàn)橹貜?fù)鍵的原因,multimap有一些函數(shù)的使用方式和map有一些區(qū)別。
訪問(wèn)元素
單個(gè)find()
multimap 的成員函數(shù) find() 可以返回一個(gè)鍵和參數(shù)匹配的元素的迭代器。
std::multimap<std::string, size_t> people {{"Ann",25},{"Bill", 46}, {"Jack", 77}, {"Jack", 32},{"Jill", 32}, {"Ann", 35} }; std::string name {"Bill"}; auto iter = people.find(name); if (iter ! = std::end (people))std::cout << name << " is " << iter->second << std::endl; iter = people.find ("Ann"); if (iter != std::end(people))std::cout << iter->first << " is " << iter->second <<std::endl;equal_range
如果我們想訪問(wèn)給定鍵對(duì)應(yīng)的所有元素。成員函數(shù) equal_range() 就可以做到這一點(diǎn)。它會(huì)返回一個(gè)封裝了兩個(gè)迭代器的 pair 對(duì)象,這兩個(gè)迭代器所確定范圍內(nèi)的元素的鍵和參數(shù)值相等。例如:
auto pr = people.equal_range("Ann"); if(pr.first != std::end(people)) {for (auto iter = pr.first ; iter != pr.second; ++iter)std:cout << iter->first << " is " << iter->second << std::endl; }insert()
只能使用insert來(lái)插入元素
例如:
reverse
區(qū)間是左閉右開(kāi)的。
reverse函數(shù)用于反轉(zhuǎn)在**[first,last)**范圍內(nèi)的順序(包括first指向的元素,不包括last指向的元素),reverse函數(shù)無(wú)返回值
rotate
template <class ForwardIterator>void rotate (ForwardIterator first, ForwardIterator middle,ForwardIterator last);官方手冊(cè)
全排列函數(shù)
頭文件:#include
函數(shù)模板:next_permutation(arr, arr+size);
函數(shù)模板:prev_permutation(arr, arr+size);
解釋:arr為數(shù)組,size為數(shù)組長(zhǎng)度。next_permutation(arr, arr+size);當(dāng)有下一個(gè)較大值返回1,否則返回0,prev_permutation(arr, arr+size);當(dāng)有上一個(gè)較小值返回1,否則返回0。例如:3 2 1,只有上一個(gè)較小值,沒(méi)有下一個(gè)較大值。1 2 3只有下一個(gè)較大值,沒(méi)有上一個(gè)較小值。2 1 3 的上一個(gè)較小值為 1 3 2,下一個(gè)較大值為 2 3 1.明白了吧!然后看下代碼,怎么去用:
includes(子集)
在stl中有一個(gè)includes函數(shù),對(duì)于vector來(lái)說(shuō),有v1和v2,如果判斷v1里面的所有元素是否被v2所包含,則可以使用
includes(begin(v1),end(v1),begin(v2),end(v2))如果v1包含v2則會(huì)返回true。
注意使用前提是必須先進(jìn)行排序
即sort(begin(v1),end(v1)) sort(begin(v2),end(v2))
二分查找
首先數(shù)組必須是有序的!
1.binary_search()(查找某個(gè)值在數(shù)組中是否存在)
使用方法:binary_search(list,list+n,a)
list為數(shù)組,a為要查詢的值,n為數(shù)組大小
binary_search返回的是真假值,就是它只判斷這個(gè)數(shù)組中是否存在這個(gè)數(shù);
2. lower_bound查找第一個(gè)大于或等于某個(gè)元素的位置
使用方法:lower_bound(list,list+n,a)
list為數(shù)組,n為數(shù)組大小,a為要查詢的值
注意事項(xiàng):lower_bound()返回的是指針,所以所以減去數(shù)組的指針就是int變量了
3.upper_bound查找第一個(gè)大于某個(gè)元素的位置。
總結(jié)
以上是生活随笔為你收集整理的算法训练之STL使用汇总的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 将优化问题转化为决策问题
- 下一篇: 基本算法之递推与递归的简单应用