非顺序容器,内部存储不是顺序的。
没有类似push(),和push_back()的方法了。
非顺序迭代器只能自增(++)和自减(--)
1.set
#include <bits/stdc++.h>
using namespace std;
int main()
{
set<int>s;
s.insert(100);
s.insert(99);
s.insert(100);
s.insert(98);
for(auto it=s.begin();it!=s.end();it++)
printf("%d ",*it);
return 0;
}
输出:98 99 100
可以看出set的两个功能:1.去重 2.自动排序。
如何进行删除某一个元素
1.删除开头
auto it=s.begin();
s.erase(it);
2.删除某一个元素就要先去找到他的迭代器
auto it=s.find(98);
但是如果set中没有98这个元素就会删除s.end程序就会崩溃
要加入一个if判断
auto it=s.find(98); if(it !=s.end()) { s.erase(it); }
3.lower_bound和upper_bound
在保证有序的前提下,lower_bound是寻找第一个大于等于a元素的元素(可以是a元素本身);upper_bound则是寻找第一个大于a元素的元素(如果没有这个元素就会用s.end来代替所以同样要加入一个if语句来判断。)
auto it=s.lower_bound(98); auto it=s.upper_bound(98);
lower_bound还可以用来寻找小于等于a元素的第一个元素
因为98这个元素可能已经是s.begin()了,所以我们要加一个if语句来判断。
auto it=s.lower_bound(98); if(it!=s.begin()) { it--; } printf("%d",*it);
set用来处理去重排序时空代价太大。logn*logn
不去重的set:multiset。
不排序的set:unoredered_set。
2.map
(1)声明一个下表为string,值为int的map,名字为m。这里赋予m一些意义以便于理解,表示人的姓名映射到他的智商。
map<string,int> m;
(2)m里面就记录了xyf的智商是200;如果插入两个xyf就会用后者替代前者
m["xyf"]=200;
(3)查询xyf的智商
cout<<m["xyf"]<<endl;
(4)查询m中是否有某一个下标
cout<<m.count("sgc")<<endl;
查询结果为0可能有两种情况:
1.值为0;
2.不存在;
这样查询会向m里添加元素,多次添加会炸空间
5.输出m的大小
cout << m.size() << endl;
6.输出m是否为空
cout << mp.empty() << endl;
7.
for (auto it = m.begin(); it != m.end();it++)
{
///这里it->first表示下标,it->second表示值
cout << it->first << ' ' << it->second << '\n';
//cout << (*it).first << ' ' << (*it).second << '\n';//这种写法也可以
}
8.清空m
m.clear();
3.priority_queue
优先队列,默认从大到小排列
priority_queue<int>q;
q.push(1);
q.push(2);
printf("%d\n",q.top());
return 0;