STL第二讲学习笔记(非顺序容器)

本文介绍了C++标准库中的非顺序容器set和map的使用,包括插入、删除、查找操作,以及lower_bound和upper_bound方法。同时讲解了priority_queue的简单应用,展示了其默认的大到小排序特性。set用于去重和自动排序,map则实现了键值对映射。文章还提及了multiset和unordered_set作为set的替代选择,以及在处理大量数据时的效率问题。
摘要由CSDN通过智能技术生成

非顺序容器,内部存储不是顺序的。

没有类似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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值