PTA小知识

目录

关于STL

C++ Lists(链表)

C++ Maps

C++ MultiMaps

C++ MultiSets

C++ Priority Queues(优先队列)

C++ Queues(队列)

C++ Sets

C++ Stacks(堆栈)

C++ Vectors

C++ Iterators(迭代器)

STL小技巧

vector动态数组

数组的倒置

不设定大小直接放入

集合的运用

添加删除与查找

set 查重

 map的运用

字符串里的小技巧

字符串的长度

判断结束标志 

一些计算小技巧

连续因子

最大公因数

阶乘和

判断质数

一些小细节


关于STL

C++ Lists(链表)

Lists将元素按顺序储存在链表中. 与 向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢.

assign()给list赋值
back()返回最后一个元素
begin()返回指向第一个元素的迭代器
clear()删除所有元素
empty()如果list是空的则返回true
end()返回末尾的迭代器
erase()删除一个元素
front()返回第一个元素
get_allocator()返回list的配置器
insert()插入一个元素到list中
max_size()返回list能容纳的最大元素数量
merge()合并两个list
pop_back()删除最后一个元素
pop_front()删除第一个元素
push_back()在list的末尾添加一个元素
push_front()在list的头部添加一个元素
rbegin()返回指向第一个元素的逆向迭代器
remove()从list删除元素
remove_if()按指定条件删除元素
rend()指向list末尾的逆向迭代器
resize()改变list的大小
reverse()把list的元素倒转
size()返回list中的元素个数
sort()给list排序
splice()合并两个list
swap()交换两个list
unique()删除list中重复的元素

C++ Maps

C++ Maps是一种关联式容器,包含“关键字/值”对

begin()返回指向map头部的迭代器
clear()删除所有元素
count()返回指定元素出现的次数
empty()如果map为空则返回true
end()返回指向map末尾的迭代器
equal_range()返回特殊条目的迭代器对
erase()删除一个元素
find()查找一个元素
get_allocator()返回map的配置器
insert()插入元素
key_comp()返回比较元素key的函数
lower_bound()返回键值>=给定元素的第一个位置
max_size()返回可以容纳的最大元素个数
rbegin()返回一个指向map尾部的逆向迭代器
rend()返回一个指向map头部的逆向迭代器
size()返回map中元素的个数
swap()交换两个map
upper_bound()返回键值>给定元素的第一个位置
value_comp()返回比较元素value的函数

C++ MultiMaps

C++ Multimaps和maps很相似,但是MultiMaps允许重复的元素。

begin()返回指向第一个元素的迭代器
clear()删除所有元素
count()返回一个元素出现的次数
empty()如果multimap为空则返回真
end()返回一个指向multimap末尾的迭代器
equal_range()返回指向元素的key为指定值的迭代器对
erase()删除元素
find()查找元素
get_allocator()返回multimap的配置器
insert()插入元素
key_comp()返回比较key的函数
lower_bound()返回键值>=给定元素的第一个位置
max_size()返回可以容纳的最大元素个数
rbegin()返回一个指向mulitmap尾部的逆向迭代器
rend()返回一个指向multimap头部的逆向迭代器
size()返回multimap中元素的个数
swap()交换两个multimaps
upper_bound()返回键值>给定元素的第一个位置
value_comp()返回比较元素value的函数

C++ MultiSets

多元集合(MultiSets)和集合(Sets)相像,只不过支持重复对象。

begin()

返回指向第一个元素的迭代器

clear()

清除所有元素

count()

返回指向某个值元素的个数

empty()

如果集合为空,返回true

end()

返回指向最后一个元素的迭代器

equal_range()

返回集合中与给定值相等的上下限的两个迭代器

erase()

删除集合中的元素

find()

返回一个指向被查找到元素的迭代器

get_allocator()

返回多元集合的分配器

insert()

在集合中插入元素

key_comp()

返回一个用于元素间值比较的函数

lower_bound()

返回指向大于(或等于)某值的第一个元素的迭代器

max_size()

返回集合能容纳的元素的最大限值

rbegin()

返回指向多元集合中最后一个元素的反向迭代器

rend()

返回指向多元集合中第一个元素的反向迭代器

size()

多元集合中元素的数目

swap()

交换两个多元集合变量

upper_bound()

返回一个大于某个值元素的迭代器

value_comp()

返回一个用于比较元素间的值的函数

C++ Priority Queues(优先队列)

C++优先队列类似队列,但是在这个数据结构中的元素按照一定的断言排列有序。

empty()如果优先队列为空,则返回真
pop()删除第一个元素
push()加入一个元素
size()返回优先队列中拥有的元素的个数
top()返回优先队列中有最高优先级的元素

C++ Queues(队列)

C++队列是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构。

back()返回最后一个元素
empty()如果队列空则返回真
front()返回第一个元素
pop()删除第一个元素
push()在末尾加入一个元素
size()返回队列中元素的个数

C++ Sets

集合(Set)是一种包含已排序对象的关联容器

begin()

返回指向第一个元素的迭代器

clear()

清除所有元素

count()

返回某个值元素的个数

empty()

如果集合为空,返回true

end()

返回指向最后一个元素的迭代器

equal_range()

返回集合中与给定值相等的上下限的两个迭代器

erase()

删除集合中的元素

find()

返回一个指向被查找到元素的迭代器

get_allocator()

返回集合的分配器

insert()

在集合中插入元素

lower_bound()

返回指向大于(或等于)某值的第一个元素的迭代器

key_comp()

返回一个用于元素间值比较的函数

max_size()

返回集合能容纳的元素的最大限值

rbegin()

返回指向集合中最后一个元素的反向迭代器

rend()

返回指向集合中第一个元素的反向迭代器

size()

集合中元素的数目

swap()

交换两个集合变量

upper_bound()

返回大于某个值元素的迭代器

value_comp()

返回一个用于比较元素间的值的函数

 

C++ Stacks(堆栈)

C++ Stack(堆栈) 是一个容器类的改编,为程序员提供了堆栈的全部功能,——也就是说实现了一个先进后出(FILO)的数据结构。

操作比较和分配堆栈
empty()堆栈为空则返回真
pop()移除栈顶元素
push()在栈顶增加元素
size()返回栈中元素数目
top()

返回栈顶元素

C++ Vectors

Vectors 包含着一系列连续存储的元素,其行为和数组类似。访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线性时间复杂度

Constructors构造函数
Operators对vector进行赋值或比较
assign()对Vector中的元素赋值
at()返回指定位置的元素
back()返回最末一个元素
begin()返回第一个元素的迭代器
capacity()返回vector所能容纳的元素数量(在不重新分配内存的情况下)
clear()清空所有元素
empty()判断Vector是否为空(返回true时为空)
end()返回最末元素的迭代器(译注:实指向最末元素的下一个位置)
erase()删除指定元素
front()返回第一个元素
get_allocator()返回vector的内存分配器
insert()插入元素到Vector中
max_size()返回Vector所能容纳元素的最大数量(上限)
pop_back()移除最后一个元素
push_back()在Vector最后添加一个元素
rbegin()返回Vector尾部的逆迭代器
rend()返回Vector起始的逆迭代器
reserve()设置Vector最小的元素容纳数量
resize()改变Vector元素数量的大小
size()返回Vector元素数量的大小
swap()交换两个Vector

C++ Iterators(迭代器)

迭代器可被用来访问一个容器类的所包函的全部元素,其行为像一个指针。举一个例子,你可用一个迭代器来实现对vector容器中所含元素的遍历。有这么几种迭代器如下:

迭代器描述
input_iterator提供读功能的向前移动迭代器,它们可被进行增加(++),比较与解引用(*)。
output_iterator提供写功能的向前移动迭代器,它们可被进行增加(++),比较与解引用(*)。
forward_iterator可向前移动的,同时具有读写功能的迭代器。同时具有input和output迭代器的功能,并可对迭代器的值进行储存。
bidirectional_iterator双向迭代器,同时提供读写功能,同forward迭代器,但可用来进行增加(++)或减少(--)操作。
random_iterator随机迭代器,提供随机读写功能.是功能最强大的迭代器, 具有双向迭代器的全部功能,同时实现指针般的算术与比较运算。
reverse_iterator如同随机迭代器或双向迭代器,但其移动是反向的。(Either a random iterator or a bidirectional iterator that moves in reverse direction.)(我不太理解它的行为)

第种容器类都联系于一种类型的迭代器。第个STL算法的实现使用某一类型的迭代器。举个例子,vector容器类就有一个random-access随机迭代器,这也意味着其可以使用随机读写的算法。既然随机迭代器具有全部其它迭代器的特性,这也就是说为其它迭代器设计的算法也可被用在vector容器上。

如下代码对vector容器对象生成和使用了迭代器:

  vector<int> the_vector;
  vector<int>::iterator the_iterator;

  for( int i=0; i < 10; i++ )
    the_vector.push_back(i);

  int total = 0;
  the_iterator = the_vector.begin();
  while( the_iterator != the_vector.end() ) {
    total += *the_iterator;
    the_iterator++;
  }
  cout << "Total=" << total << endl;

提示:通过对一个迭代器的解引用操作(*),可以访问到容器所包含的元素。

STL小技巧

vector动态数组

数组的倒置

vector<int>a(100,0);
reverse(a.begin()+1,a.begin()+5);
//输入1~0
//翻转1~4

不设定大小直接放入

vector<int>a;
int n;
cin>>n;
F(i,1,n)
{
	int x;
	cin>>x;
	a.push_back(x);
}

集合的运用

添加删除与查找

//set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。应该注意的是set中数元素的值不能直接被改变。
set<int> s;
set<int>::const_iterator iter;
set<int>::iterator first;
set<int>::iterator second;
F(i,1,10)
{
    s.insert(i);//添加i在集合中
}
erase(iterator)//删除定位器iterator指向的值
erase(first,second)//删除定位器first和second之间的值
erase(key_value)//删除键值key_value的值

if(!a.count(x))//集合中没找到x

输入输出,是按顺序的

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,x;
	cin>>n;
	set<int>a;
	for(int i=1;i<=n;i++)
	{
		cin>>x;
		a.insert(x);
	}
	cout<<a.size()<<endl;
	for(set<int>::iterator it=a.begin();it!=a.end();it++)
	{
		if(it!=a.begin()) cout<<" ";
		cout<<*it;
	}
	
}

set 查重

set<int>set;
for(int i=y;i<y+130;i++)//i是四位数
{
	set.insert(i/1000);
	set.insert(i/100%10);
	set.insert(i/10%10);
	set.insert(i%10);//存储每个数位
	int l=set.size();//只计算不重复数位
	if(l==n)
	{
		printf("%d %04d\n",i-y,i);//有前面补充0
		break;
	}
	set.clear();//清空set		
}

L2-005

    cin>>n;
	set<int> q[55];
	F(i,1,n)
	{
		int a;cin>>a;
		F(j,1,a)
		{
			int b;
            scanf("%d",&b);
			q[i].insert(b);
		}
	}
	int k;
	cin>>k;
	F(i,1,k)
	{
		int x, y;
		int sum=0;
		scanf("%d %d",&x,&y);
		for(auto j:q[x])
        {
             if(q[y].count(j)) ++sum;
        }
		int ans=q[x].size()+q[y].size()-sum;
		double d=(double)sum/(double)ans;
		printf("%.2f%%\n",d*100/1.0);

 map的运用

基本操作

map<int,pair<int,int> >a;//建立三个数值的map (加个pair

for(auto i:a)
{
    if(i.second.first) cout<<i.fisrt<<" "<<i.second.second;//查找非键值
}

if(a.count(d))//查找key为d的
{
	ans++;
	anss+=s-a[d].first;
	anss+=a[d].second;
	a.erase(d);//删除
}

字符串里的小技巧

查找需要的小字符串

char a[35][505];
int n,m,t=0;
cin>>n;
cin.get();//getchar()读空行
F(i,1,n)
{
	cin.getline(a[i],505);//读入字符串
    //scanf("%[^\n]",a[i]);
	char *p=strstr(a[i],"qiang");
	char *l=strstr(a[i],"easy");
	if(p==NULL&&l==NULL)
    {
         //没找到
    }
}
 

字符串的长度

char strlen(a)

string a.size()

string a,b;
cin>>a;
getchar();  
getline(cin,b); 
int l1=a.size(),l2=b.size();

判断结束标志 

if(strcmp(".",a)==0) break;
#include<iostream>
using namespace std;
int main(){
	string s;cin>>s;
	int n;cin>>n;
	while(n--){
		int a,b;string x,y;cin>>a>>b>>x>>y;
		string t=s.substr(a-1,b-a+1);
		s.erase(a-1,b-a+1);
		int idx=s.find(x+y);
		if(idx<s.size()){
			s.insert(idx+x.size(),t);
		}
		else s+=t;
	}
	cout<<s;
}

字符串函数

atof()

将字符串转换成浮点数

atoi()

将字符串转换成整数

atol()

将字符串转换成长整型数

isalnum()

当字母或数字字符时, 返回真值

isalpha()

当字母字符时, 返回真值

iscntrl()

当控制字符时, 返回真值

isdigit()

当数字字符时, 返回真值

isgraph()

当非空格可打印字符时, 返回真值

islower()

当小写字母字符时, 返回真值

isprint()

当可打印字符时, 返回真值

ispunct()

当标点字符时, 返回真值

isspace()

当空格字符时, 返回真值

isupper()

当大写字母字符时, 返回真值

isxdigit()

当十六进制字符时, 返回真值

memchr()

在某一内存范围中查找一特定字符

memcmp()

比较内存内容

memcpy()

拷贝内存内容

memmove()

拷贝内存内容

memset()

将一段内存空间填入某值

strcat()

连接两个字符串

strchr()

查找某字符在字符串中首次出现的位置

strcmp()

比较两个字符串

strcoll()

采用目前区域的字符排列次序来比较字符串

strcpy()

拷贝字符串

strcspn()

在某字符串中匹配指定字符串

strerror()

返回错误码对应的文本信息

strlen()

返回指定字符串的长度

strncat()

连接某一长度的两个字符串

strncmp()

比较某一长度的两个字符串

strncpy()

复制某一长度的一个字符串到另一字符串中

strpbrk()

查找某字符串在另一字符串中首次出现的位置

strrchr()

查找某字符在字符串中末次出现的位置

strspn()

返回子串的长度,子串的字符都出现包含于另一字符串中

strstr()

在一字符串中查找指定的子串首次出现的位置

strtod()

将字符串转换成浮点数

strtok()

查找指定字符之前的子串

strtol()

将字符串转换成长整型数

strtoul()

将字符串转换成无符号长整型数

strxfrm()

转换子串, 可以用于字符串比较                             

tolower()

将字符转换成小写字符

toupper()

将字符转换成大写字符

一些计算小技巧

连续因子

F(i,2,sqrt(n))
{
    if(n%i==0)
    {
        int l=n/i;
        int j=i+1;
        while(l%j==0)
        {
            l/=j;
            j++;

        }
        if(j-i>maxx)
        {
            ans=i;
            maxx=j-i;
        }
    }
}

最大公因数

long long gcd(long long x,long long y)
{
	return y?gcd(y,x%y):x;
}

 最小公倍数=x*y/gcd;

阶乘和

int ans=1,sum=0;
F(i,1,n)
{
	ans*=i;
	sum+=ans;
}

判断质数

int pd(int n)
{
	if(n==1)
		return 0;
	if(n==2)
		return 1;
	int k=sqrt(n);
	for(int i=2;i<=k;i++)
	{
		if(n%i==0)
			return 0;
	}
	return 1;
 } 

一些小细节

输出

printf("%-5d",i);//五个字符宽度,向左对齐
printf("%.2f%%\n",d*100/1.0);//小数的百分数表达
//需要某种不同数量的更改,可以循环和if一起上
while(g+p+l+t>0)
	{
		if(g>0) ......
	}

比较 

//在数组中,找一个数,可以存下标,比较数组大小
if(a[i]>=a[maxx])
	{
		maxx=i;
	}

结构体

struct dd
{
	string name;
	int a,b;
	
}data;
bool cmp(dd a, dd b)
{
    return a.name>b.name;
}
sort(a+1,a+10005,cmp);

数学函数

abs()
 求绝对值
 
acos()
 求反余弦
 
asin()
 求反正弦
 
atan()
 求反正切
 
atan2()
 求反正切,按符号判定象限
 
ceil()
 求不小于某值的最小整数 (求上界)
 
cos()
 求余弦
 
cosh()
 求双曲余弦
 
div()
 求商和余数
 
exp()
 求e的幂
 
fabs()
 求浮点数的绝对值
 
floor()
 求不大于某值的最大整数 (求下界)
 
fmod()
 求模数
 
frexp()
 求数的科学表示法形式
 
labs()
 求长整型数的绝对值
 
ldexp()
 以科学计数法计算
 
ldiv()
 以长整型返回商和余数
 
log()
 自然对数
 
log10()
 以10为底的自然对数
 
modf()
 将一个数分解成整数和小数部分
 
pow()
 求幂
 
sin()
 求正弦
 
sinh()
 求双曲正弦
 
sqrt()
 求平方根
 
tan()
 求正切
 
tanh()
 求双曲正切
 

以前写的不知道啥东西 

#include<bits/stdc++.h>
int f[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};
char a[55][55];
int n,m,x,y,v,d;
void dfs(int fx,int sd)
{
	for(int i=1;i<=sd;i++)
	{
		if(x+f[fx][0]>n||x+f[fx][0]<1||y+f[fx][1]<1||y+f[fx][1]>m)//边界
		{
			printf("Crash! %d %d\n",x,y);
			v=0;
			return;
		}
		else if(f[fx][0]!=0&&f[fx][1]!=0)
		{
			if((a[x+f[fx][0]][y]=='.'||a[x][y+f[fx][1]]=='.')&&a[x+f[fx][0]][y+f[fx][1]]=='.')//是否遇到障碍
			{
				x+=f[fx][0];
				y+=f[fx][1];
			}
			else
			{
				printf("Crash! %d %d\n",x,y);
				v=0;
				return;
			}
		}
		else
		{
			if(a[x+f[fx][0]][y+f[fx][1]]=='.')
			{
				x+=f[fx][0];
				y+=f[fx][1];
			}
			else
			{
				printf("Crash! %d %d\n",x,y);
				v=0;
				return;
			}
		}
	}
	printf("%d %d\n",x,y);
}
using namespace std;
int main()
{
	
	
	cin>>n>>m;getchar();
	for(int i=1;i<=n;i++)
	{
		for(int k=1;k<=m;k++)
		{
			scanf("%c",&a[i][k]);
			
			if(a[i][k]=='*')
			{
				x=i;y=k;
				a[i][k]='.';
			}
		}getchar();
	}
	int q;
	char b;
	cin>>q;
	getchar();
	for(int i=1;i<=q;i++)
	{
		scanf("%c",&b);
		if(b=='R')
		{
			d++;
			if(d==8) d=0;			
		}
		else if(b=='L')
		{
			d--;
			if(d==-1) d=7;
		}
		else if(b=='U')
		{
			v++;
		}
		else
		{
			v--;
			if(v<0) v=0;
		}
		//cout<<d<<" "<<v<<endl;
		dfs(d,v);
	}
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值