STL(主要函数及时间复杂度)

(总结ing)

map

特性

key - value 键值对。map自动排序,每个key只出现一次。

函数

insert O(log n)

erase O(log n)

count O(log n)
只会返回 0或者 1,判断某个数是否存在。

find O(log n)
若存在返回迭代器,否则返回 mp.end()

void slove()
{
    map<int, int> mp;
    mp[1]++; mp[1]++; mp[2]++;
    auto it = mp.find(1);
    cout<<it->first<<endl;
    cout<<it->second<<endl;
}

auto遍历
i.second = 0; 不改变原来的值。mp[i.first] = 0; 可以改变。

unordered_map

特性

内部数据是无序的,甚至和初始时的顺序都不一样。

函数

函数与map基本一样。查找速度O(1),其他方面耗时最坏能达到 O(n),容易被卡。(待验证)

vector

特性

基于倍增思想的可变长数组。vector不适合用于大量数据的插入和删除。

函数

push_back O(1)
将元素插到尾部

pop_back O(1)
将尾部元素删除

insert / erase O(n)

find O(n)
使用的是 algorithm的 find函数。

void slove()
{
    vector<int> v;
    v.push_back(1);    
    v.push_back(2);
    v.push_back(3);
    cout<< find(v.begin(), v.end(), 3) - v.begin() <<endl;
}

lower_bound O(log n)
返回第一个大于等于 x的数的地址。

    cout<< lower_bound(v.begin(), v.end(), 2) - v.begin() <<endl;

upper_bound O(log n)
返回第一个大于 x的数的地址。

    cout<< upper_bound(v.begin(), v.end(), 2) - v.begin() <<endl;

deque

特性

双端队列支持在两端高效插入或删除元素,支持随机访问。

函数

begin / end O(1)
头 / 尾迭代器

front / back O(1)
队头 / 队尾元素

push_back / pop_back O(1)
从队尾入队 / 出队

push_front / pop_front O(1)
从队头入队 / 出队

clear O(n)
清空队列

queue

特性

先进先出。

函数

push O(1)
从队尾入队

pop O(1)
从队头出队

front O(1)
队头元素

back O(1)
队尾元素

priority_queue

特性

优先队列具有队列的所有特性,包括基本操作,只是在它基础上添加了内部的一个排序,它本质是一个堆实现的。
可重载运算符 <

// 升序队列
priority_queue <int,vector<int>,greater<int> > q;

// 降序队列(默认类型-大顶堆)
priority_queue <int,vector<int>,less<int> >q;

函数

push O(log n)
插入元素

top O(1)
查询堆顶元素

pop O(log n)
删除堆顶元素

set

特性

有序集合,即元素不可重复。

函数

迭代器 ++ / - - O(log n)

begin / end O(1)
头部 / 尾部迭代器,end是最大元素的下一个位置。

insert O(log n)
插入元素,若已存在就不会再插入

find O(log n)
查找元素,返回迭代器,若不存在返回end。

lower_bound / upper_bound O(log n)
查找大于等于x / 查找大于x

erase O(log n)
删除迭代器指向的元素

count O(log n)
元素x的个数。

multiset

特性

有序可重复集合。

函数

函数和set的都一样,但erase和count的时间复杂度是O(k + log n)。

bitset

特性

bitset可看作一个多位二进制数。

函数

位运算操作符
~s
返回对bitset按位取反的结果

& | ^
返回对两个相同位数的bitset执行按位与,或,异或的运算结果。

>> <<
返回一个bitset右移,左移若干位的结果。

== !=
比较两个bitset是否相等

[ ]操作符
s[k]代表s的第k位。

count
s.count()返回有多少位1。

s.set() / s.reset()
把s所有位变为1
把s的所有位变为0

s.set(k, v) / s.reset(k)
把s的第k位变为v,即s[k] = v
把s的第k位改为0

s.flip()
把s的所有位按位取反

s.lip(k)
把s的第k位取反

any / none
若s所有位都为0,s.any()返回false,s.none()返回true
若s至少一位为1,s.any()返回true,s.some()返回false

  • 15
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值