STL 标准模板库 容器 用法集结
NO.1 stack 栈
库
#include<stack>
定义方式
stack<_template> s;//参数也是数据类型,这是栈的定义方式
常用操作
- s.empty()//如果栈为空返回true,否则返回false
- s.size()//返回栈中元素的个数
- s.pop()//删除栈顶元素但不返回其值
- s.top()//返回栈顶的元素,但不删除该元素
s.push(X)//在栈顶压入新元素 ,参数X为要压入的元素
For exanple:
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <stack> using namespace std; int main() { stack<char> s; s.push(a); cout << s.top() <<endl; s.push(b); cout << s.top(); s,pop(); cout << s.top(); return 0; }
NO.2 queue 队列
库
#include<queue>// 队列
定义方式
queue<_template> q; //参数是数据类型,这是队列的定义方式
常用操作
- q.empty()// 如果队列为空返回true,否则返回false
- q.size() // 返回队列中元素的个数
- q.pop() //删除队列首元素但不返回其值
- q.front() // 返回队首元素的值,但不删除该元素
- q.push(X) //在队尾压入新元素 ,X为要压入的元素
q.back() //返回队列尾元素的值,但不删除该元素
For example:
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <queue> #include <stack> #include <vector> using namespace std; int main() { queue<int> q; stack<char> s; q.push(1); cout << q.enpty() << endl; q.push(2); cout << q.front() << endl; q.pop(); cout << q.front() << endl; q.pop(); cout << q.empty() <<endl; return 0; }
注:STL虽然方便,但使用常数巨大,如若使用以上两种数据结构,建议手写。
NO.3 priority_queue 优先队列或堆
库
#include<queue>
定义方法
priority_queue<_template,vector<_template>,cmp> q;//vector是什么,后面会讲
cmp是我们自己编的一个这个堆比较优先级的形似函数的结构体,如下:
struct cmp{ bool operator () (int a,int b) { return a>b; } };
注:这是一个小根堆,大于号是小根堆。
struct cmp{ bool operator () (int a,int b) { return a<b; } };
注:这是一个大根堆,小于号是大根堆。
具体如何定义cmp请参照 https://www.cnblogs.com/xzxl/p/7266404.html
operator重载运算符请参照 https://www.cnblogs.com/xiangxiaodong/archive/2012/02/12/2348144.html
常用操作
- empty()//如果队列为空,则返回真
- pop()//删除对顶元素,删除第一个元素
- push()//加入一个元素
- size()//返回优先队列中拥有的元素个数
top()//返回优先队列对顶元素,返回优先队列中有最高优先级的元素
For example:
#include<iostream> #include<queue> #include<vector> #include<cmath> #include<stdlib.h>//rand()库 using namespace std; struct cmp{ bool operator () (int a,int b) { return a>b;//小根堆 } }; priority_queue<int,vector<int>,cmp> q; int main() { int n; cin>>n; for(int i=1;i<=n;i++) { int x=rand()%1000;//生成随机数,不同电脑数不一样,电脑相同,数可能一样,非常慢。 cout<<x<<" "; q.push(x); } cout<<endl; cout<<q.size()<<endl; while(q.empty()==0) { cout<<q.top()<<" "; q.pop(); } cout<<endl; cout<<q.size()<<endl; }
No.4 deque 双端队列
库
#include<deque>;
定义方式
\deque<_template> deq;
常用操作
- push_back(int x)//尾部加入
- size()//长度
- resize(int a)//保留0至a-1个元素,其余删掉
- empty()//同上
- begin()//返回首元素迭代器(迭代器到后面会有介绍)
- end()//返回尾元素迭代器
- push_front(int x)//望首加元素
- pop_front()//删除首元素
- pop_back()//删除尾元素
- front()//返回首元素
back()//返回尾元素
注:若想访问,用数组下标即可。比如我想访问第七个这个元素,则dep[7];
以上皆为常用操作,若还想了解其它操作,请登录网站https://www.cnblogs.com/TianMeng-hyl/p/12229706.html
NO.5 迭代器
- 迭代器可以简单地理解为指针,怎样声明:
容器名<_template>::iterator it;
- 如何遍历: 以deque为例
for (it = deq.begin(); it != deq.end(); it++) cout << *it << endl;
这样*it为每一个元素
No.6 set 集合
代码网址<blog.csdn.net/byn12345/article/details/79523516>
注:因为集合的特殊性,其中的每一个元素会且仅会出现一次,就是说不会有重复元素,而且会排序
库
#include<set>
定义方式
\set<_template> S;
常用操作
- insert()//加入元素
- size()//长度
- clear()//清空
......
还有许多操作...
For example:
#include <iostream> #include <set> using namespace std; int main(){ set<int> s; s.insert(1); s.insert(2); s.insert(3); s.insert(1); cout<<"set 的 size 值为 :"<<s.size()<<endl; cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl; cout<<"set 中的第一个元素是 :"<<*s.begin()<<endl; cout<<"set 中的最后一个元素是:"<<*s.end()<<endl; s.clear(); if(s.empty()) { cout<<"set 为空 !!!"<<endl; } cout<<"set 的 size 值为 :"<<s.size()<<endl; cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl; return 0; }
No.7 vector 向量
通俗点说,就是不定长数组
库
#include<vector>
定义方式
\vector<_template>
常用操作
- v.push_back();// 尾部添加元素
- v.pop_back();// 尾部删除元素
- v.size();// 元素数量
v.resize(int x);// 保留1至x的元素
For example
#include<iostream> #include<vector> using namespace std; vector<int> v; int main() { v.push_back(1); v.pop_back(); cout<<v.size()<<endl; v.push_back(1); v.push_back(2); v.push_back(3); v.resize(2); //数组元素:1,2 cout<<v.size()<<endl; }
No.8 map 映射
库
#inlcude<map>
定义方式
map<_template,_template> M;
常用操作
- 对于map,我经常使用他的数组形式,而不是他的成员函数,例如:
map<string,int> M; M["Monday"]=1;
简单来说,就是定义了一个下个可以是任何东西的数组。
所有的容器,都可以通过迭代器的方法遍历。需要begin()和end(),但也略有不同,每一个it都是一个pair(pair是什么下面会讲),pair的first,是数组下标,second是值,例如:
#include<iostream> #include<map> using namespace std; map<string,int> M; int main() { string day; int i; while(cin>>day) { cin>>i; M[day]=i; if(i==7) break; } map<string,int>::iterator it; for(it=M.begin();it!=M.end();it++) { cout<<it->first<<" "<<it->second<<endl; } } /* Monday 1 Tuesday 2 Wednesday 3 Thursday 4 Friday 5 Saturday 6 Sunday 7 */
map在贮存是会按照一种顺序,所以在用结构体时,需要重载<号
For example:
#include<iostream> #include<map> using namespace std; map<string,int> M; int main() { string day; int i; while(cin>>day) { cin>>i; M[day]=i; if(i==7) break; } map<string,int>::iterator it; for(it=M.begin();it!=M.end();it++) { cout<<(*it).first<<" "<<(*it).second<<endl; } }
大家看到了两种遍历方式,都可。
No.9 pair
你可以理解为pair是一个数对
库
#include<pair>
定义方式
常用操作
pair<T1, T2> p1; //创建一个空的pair对象(使用默认构造),它的两个元素分别是T1和T2类型,采用值初始化。 pair<T1, T2> p1(v1, v2); //创建一个pair对象,它的两个元素分别是T1和T2类型,其中first成员初始化为v1,second成员初始化为v2。 make_pair(v1, v2); // 以v1和v2的值创建一个新的pair对象,其元素类型分别是v1和v2的类型。 p1 < p2; // 两个pair对象间的小于运算,其定义遵循字典次序:如 p1.first < p2.first 或者 !(p2.first < p1.first) && (p1.second < * * p2.second) 则返回true。 p1 == p2; // 如果两个对象的first和second依次相等,则这两个对象相等;该运算使用元素的==操作符。 p1.first; // 返回对象p1中名为first的公有数据成员 p1.second; // 返回对象p1中名为second的公有数据成员
For example:
std::pair<std::string, int> getPreson() { return std::make_pair("Sven", 25); } int main(int argc, char **argv) { std::string name; int ages; std::tie(name, ages) = getPreson(); std::cout << "name: " << name << ", ages: " << ages << std::endl; return 0; }
除了迭代器,这是另一种接收方式,详见https://blog.csdn.net/sevenjoin/article/details/81937695.
来源:https://www.cnblogs.com/TianMeng-hyl/p/12229033.html