算法竞赛中常用的STL

C++标准模板库(STL)封装了大量十分有用的数据结构和算法,熟练使用STL将会使我们的程序编写如虎添翼。接下来会介绍几种在程序竞赛中常用到的STL类。如果想了解更多,推荐直接访问官方文档搜索查阅

[TOC]

bitset

可以理解为bit这个数据类型的数组(即取值只为0/1),大多数情况下,每个元素所占内存确实只有1bit,是bool类型的1/8。方便各种位操作的进行。

构造方法

都需要在定义时指明长度

1
2
3
4
5
6
7
8
默认:
std::bitset<16> foo;	//填充0

整数:
std::bitset<16> foo(0x1111);	//0001000100010001

std::string
std::bitset<4> foo(std::string("1010"));	//1010
位操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[]:
类似数组直接访问

.count():
返回一个bitset中1的个数
    
.size():
返回一个bitset的长度
    
.any():
返回一个bool值,表示这个bitset中是否至少有一个1,与.none()相反

.all():
返回一个bool值,表示这个bitset中是否全为1

.set():
将bitset全置1
.set(size_t pos, bool val = true)
将pos位上元素置val值
整体操作
1
2
3
to_string()	//convert to std::string
to_ulong()	//convert to unsigned long
to_ullong()	//convert to unsigned long long

priority_queue

优先队列(默认)的本质是一个大根堆,它的top元素始终是最大的。

优先队列的底层container默认是vector。

构造方法
1
2
3
std::priority_queue<int, std::vector<int>, std::greater<int> > pq(first,last);
//指定比较函数greater,变为小根堆
//first和last是储存初始化数据的数组指针
成员函数
1
2
3
4
5
.empty(): return true if it's empty
.size(): return size    
.top(): 获取顶部元素
.push(): 插入元素
.pop(): remove top element

pair

保存了一个有序对,两个元素分别为first和second,可以有不同类型

重载函数
1
2
3
4
5
6
7
8
9
10
头文件<utility>
    
关系比较:
先比较first,再比较second

swap(p1,p2):
交换两个同类型的pair object
    
get<I>(pair p)
I为0时返回first元素,为1时返回second
构造
1
2
3
4
5
6
7
8
普通构造方式略。
    
很多其他stl数据结构中有用到make_pair函数
template <class T1,class T2>
  pair<T1,T2> make_pair (T1 x, T2 y)
  {
    return ( pair<T1,T2>(x,y) );
  }

lower_bound

参数(first, last, x),原数组已从小到达排序

在[first, last)中找到第一个>=x的元素的位置

upper_bound是找到第一个>x的元素位置

这两个函数中,如果找不到满足要求的,返回last

auto

可遍历vector和map

1
2
3
4
5
6
7
8
9
10
11
int main()
{
    map<int, string> mp;
    mp.insert(pair<int,string>(2,"hello"));
    mp.insert(pair<int,string>(1,"miaomiaomiao"));
    mp.insert(pair<int,string>(3,"world"));
    
    for(auto &p : mp)
	    cout << p.first << endl; 
    return 0;
}

输出1、2、3

可见是按照key值遍历组成map的这些pair

string

1
2
string::substr()
string substr (size_t pos = 0, size_t len = npos) const;返回子串

map

1
2
3
4
5
6
重载[](key_type k)
等价于(*((this->insert(make_pair(k,mapped_type()))).first)).second
如果mp中存在匹配到k的pair,则返回这个pair.second的引用
否则插入一个新的pair,second值为0
    
    对于计数类型的输入,我们可以每次mp[x]+=1;它会从0开始向上加

vector

可用vector:reserve(n)进行预先内存分配

vector成员函数

1
2
3
.back()取最后一个元素值
.front()取第一个
.pop_back()弹出最后一个

set

内部是一棵红黑树,有序存储元素。(默认升序)

1
2
3
4
5
6
7
set.erase(iterator或value):返回删除元素的下一个iterator	或
set.erase(iterator first,iterator last):抹去[first,last)区间,返回抹去元素数量
                                           
set.lower_bound&upper_bound(value)
                                           
不能存同值元素。
insert插入元素,find寻找值等于某一元素的iterator找不到返回end,count存在返回1否则返回0
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Absoler

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值