【week1day2笔记】STL基础

STL由三部分构成:容器,算法与迭代器。
对STL的合理使用可以大幅缩短代码,减少编写时间。
但在一些情况下,STL的运行效率弱于手写算法与数据结构,有造成TLE的风险。

容器与迭代器
常用容器:
线性容器:array, vector, deque, forward_list, list
相关性容器:set, map, multiset, multimap
无序相关性容器:unordered_set, unordered_map, unordered_multiset, unordered_multimap
容器适配器:stack, queue, priority_queue
其它:span(C++20)

迭代器的概念类似于C中的指针,用于表示容器中某一个元素的位置。STL中每一种容器都定义了相应的迭代器。其使用方法与指针也有一定的类似之处。
分别以vector, map为例

正向打印vector中元素:

vector <int> n;
vector <int> :: iterator it;
/*输入过程略*/
for(it=n.begin();it!=n.end();it++)                 //!=可写为<
    cout<<*it<<endl;

反向打印map中的元素:

map <int,int> num;
map <int,int>::reverse_iterator it;                //反向迭代器
/*输入过程略*/
for(it=num.rbegin();it!=num.rend();it++)           //!=不可写为<或>
    cout<<it->first<<' '<<it->second<<endl;

array
构建格式:array < T , N > num; (T为类型,N为大小)
array实际作用与常规数组类似,在竞赛过程中可以直接使用数组代替

vector
构建格式: vector < T > num; (T为类型,其他构建格式用处不大,略)
末尾插入: num.push_back( n );
迭代器位置插入: num.insert( it , n );
末尾删除: num.pop_back();
迭代器位置删除: num.erase( it );
迭代器片段删除: num.erase( it1, it2 );
清空: num.clear();
其余函数略
vector最大的特点在于其长度可变,但由于时间效率问题本人不太喜欢使用

deque
构建格式: deque< T > num
首端插入: num.push_front( n );
末端插入: num.push_back( n );
首段删除: v.pop_front();
末端删除: v.pop_back();
迭代器位置删除: v.erase( it );
双端队列,可以头插尾插,头弹尾弹

forward_list
构建格式: forward_list < T > num;
长度计算: len = diatance ( num.begin() , num.end() );(forward_list没有直接可用的size)
首端插入: num.push_front( n );
首端删除: num.pop_front();
(forward_list没有尾端插入,删除,和反向迭代器)
迭代器位置插入: num.insert_after( it, n );
迭代器位置删除: num.erase_after( it, n );
单向链表,了解了就行了

list
和forward_list类似,多出尾端插入,删除,和反向迭代器等功能,略

set
构建格式: set < T > num;
插入元素: num.insert( n );
删除元素: num.erase( n );
返回第一个大于等于key_value的迭代器: lower_bound(key_value);
返回最后一个大于等于key_value的迭代器: upper_bound(key_value);
set是集合,集合中每一个元素只会出现一次。set中元素会自动按从小到大顺序排序,若定义结构体类型的set,可通过重载运算符应用其自动排序功能

map
构建格式: map < T1 , T2 > num;,其中,T1是key的类型,T2是key对应值的类型,一般T2用int型,T1随意
插入元素: num.insert ( pair < T1 , T2 > ( n1, n2 ) );(不常用)
常见用法: num[ n1 ] += x;
map,映射,最常见的作用是在一系列有重复内容的数据中,统计出各个数据出现的数量。

priority_queue
构建格式1(升序): priority_queue < T, vector < T >,greater<T> > num;
构建格式2(降序): priority_queue < T, vector < T >,less<int> > num;
插入元素: num.push( n );
访问队头: num.top();
删除队头: num.pop();
优先队列实质上是堆,会根据构建使定义的顺序,自动排序序列内元素,可以定义结构体并重载运算符指定优先队列根据数据的某项性质自动排序

其他容器略

常用算法
copy, move, fill, swap, reverse, rotate, unique, sort, lower_bound, upper_bound, binary_search, max, min, is_permuation, next_permutation, prev_permutation
具体内容略

bitset
构建格式1: bitset< n > num; 其中n为长度
构建格式2: bitset< n > num (string "10111" );
构建格式3: bitset< n > num ( n );(十进制数可以直接转化为bitset)
bitset类似于一个bool型数组,其中每一位只能是0或1,存储二进制数
bitset可以进行按位与,按位或,按位异或,左移,右移操作

例题 CodeForces 583C

#include<cstdio>
#include<iostream>
#include<map>
using namespace std;
int gcd(int a,int b)
{
	if(a%b==0)return b;
	return gcd(b,a%b);
}
int main()
{
	int n,cnt,tmp;
	int ans[510],len=0;
	map <int,int> num;
	map <int,int>::reverse_iterator it;
	scanf("%d",&n);
	for(int i=0;i<n*n;i++)
	{
		scanf("%d",&tmp);
		num[tmp]++;
	}
	for(it=num.rbegin();it!=num.rend();)
	{
		if(it->second==0){it++;continue;}
		ans[len++]=it->first;
		for(int i=0;i<len;i++)
		{
			int res=gcd(ans[i],ans[len-1]);
			if(i==len-1)num[res]--;
			else num[res]-=2;
		}
	}
	for(int i=0;i<len;i++)printf("%d ",ans[i]);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值