C++的STL库一些方法调用

本文详细介绍了C++的STL库,包括容器如vector、deque、list、stack、queue和priority_queue的使用,迭代器的概念,以及算法如find、find_if、copy和sort的应用。此外,还涵盖了映射表map、multimap,集合set、multiset,以及堆和哈希的相关操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

头文件<functional><algorithm>

1.容器
近容器:
char buffer[1024]; string str; bitset位容器<-->vector<bool>
顺序容器:                              resize()
vector(内存可自增长的数组)    reserve(100)预留空间    push_back(val)    insert(iterator, val)    erase(val)    clear()    size()    empty()       erase(it1, it2)//删除it1到it2的值
deque(双端队列)    动态开辟的二维数组    push_back    push_front  pop_back    pop_front    insert(iterator, val)
list(双向链表)    push_back   push_front    pop_back    pop_front    insert(iterator, val)  splice元素分割,直接将一个链连到另一条链上

迭代器
反向迭代器通过迭代器来实现
 
容器适配器:底层没有数据结构,用的是标准容器,只是把容器方法封装一下
1.stack底层实现deque,成员方法push,pop,top等
2.queue底层实现deque,成员方法push,pop,front等
3.priority_queue底层实现vector,成员方法push(先c.push_back(),后push_heap(c.begin(),c.end(),小根/大根)),pop(先pop_heap后pop_back),top(调的是vector的front)等
优先级队列,默认less,底层调用了make_heap形成大根堆;greater<int>数越小优先级越高,处于对头

算法(以vector为例)
find(vec.begin(), vec.end(), val)查找某个值()
find_if(vec.begin(), vec.end(), bind1st(greater<int>(), 50))查找第一个比50小的值,bind1st:绑定第一个值,采用greater函数对象
find_if(vec.begin(), vec.end(), not1(bind2nd(greater<int>(), 50))和上面结果相同
not1:给一元函数对象取反    not2:给二元函数对象取反
copy(vec.begin(), vec.end(), back_inserter(vec2))//后插入型迭代器,调用push_back//不能为front_inserter,因为vector没有push_front
copy(vec.begin(), vec.end(), inserter(vec2,vec2.begin()))//调用insert(iterator,val)
不能使用copy(vec.begin(), vec.end(), vec2.begin())因为vec2没有内存
//输出
copy(vec.begin(), vec.end(), ostream_iterator<int>(cout, " "))
copy(istream_iterator<int>(cin),(istream_iterator<int>(), back_inserter(vec))
sort(vec.begin(), vec.end())//从小到大
sort(vec.begin(), vec.end(), greater<int>())//从大到小

make_heap(vec.begin(),vec.end(),greater<int>())//创建小根堆
push_heap(vec.begin(),vec.end(),greater<int>())//push_back后,重新调整堆
pop_heap(vec.begin(),vec.end(),greater<int>())//顶端元素换到最后,重新调整堆,之后pop_back删除最后一个元素

map/multimap(映射表)    Key_Value键值对    multimap允许key相同 map简直不允许重复,底层红黑树
map<int,string> mymap;定义对象
mymap.insert(make_pair(10,"hello")) || mymap[20] = "hahaha"插入数据pair是一个类,makepair是对应的函数模板,推演实参
mymap<int,string>::iterator it = mymap.begin()/.find(key);
key:it->first,val:it->second//map对应的两个值
mymap.erase(iterator)/mymap.erase(it1,it2)/mymap.erase(key)删除值
multimap<int,string,greater<int>> mymultimap//改变排序方式

set/multiset(集合key)底层红黑树(二叉排序树),默认从小到大,less
set<int> set1;//定义对象
set1.insert(val);//插入数据
multiset<int,greater<int>> myset;//改变排序方式
myset.count(20)//求20的个数
myset.find(20)//只能找到第一个值,相同的后面的值找不到
myset.erase(20)//所有20均被删

Hash
Hash是一种映射查找算法,例如判断str1中出现在str2中字符的个数

算法性能提升
用位运算来实现上面的 除法和取模运算,*str1 / 8 等价于 *str1 >> 3,另外,一个数N除以 2^m 的余数 实际上是N的低 m bit位所表示的十进制数,即*str1%(2^3)等价于 *str1 & 7
专门有一个类为Hash,里有求哈希值方法,根据Key求得哈希值index,然后在_hashmap[index]里找是否存在key,若存在则覆盖value,若不存在则插入node(key,value)
vector<list<node>> _hashmap;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值