c++ 学习first day

admin2024-07-07  4

STL map string

http://t.csdnimg.cn/H8dhK

http://t.csdnimg.cn/KQBbU

1.寄包柜

 STL map

learn 红黑树 AVL树

http://t.csdnimg.cn/VRZMN

map 是具有唯一键值对的容器,通常使用红黑树实现。

map 中的键值对是 key value 的形式,比如:每个身份证号对应一个人名(反过来不成立哦!),其中,身份证号就是 key,人名便是 value,是单项的关系,可以与 hash 作类比。

//使用 map 需要引入头文件,如下所示:
#include <map>
//定义形式如下所示:
map<key_type, value_type>变量名
//注意:如果没有 using namespace std, map需要写成 std:map
//常用
size()     // 计算元素个数
empty()    // 判断是否为空,空返回 true
clear()    // 清空容器
erase()    // 删除元素
find()     // 查找元素
insert()   // 插入元素
count()    // 计算指定元素出现的次数
begin()    // 返回迭代器头部
end()      // 返回迭代器尾部
 
//非常用
swap()        // 交换两个map容器,类型需要相同
max_size()    // 容纳的最大元素个数
rbegin()      // 指向map尾部的逆向迭代器
rend()        // 指向map头部的逆向迭代器
lower_bound() // 返回键值大于等于指定元素的第一个位置
upper_bound() // 返回键值大于指定元素的第一个位置
equal_range() // 返回等于指定元素的区间

 忘了换行符了。

#include<cstdio>
#include<map>
using namespace std;
map<long long,long long>a[100001];
int main()
{
	int n,m,x;
	scanf("%d %d",&n,&m);
	long long i,j,k;
	while(m--)
	{
		scanf("%d",&x);
		if(x==1)
		{
			scanf("%lld %lld %lld",&i,&j,&k);
			a[i][j]=k;
		}else if(x==2)
		{
			scanf("%lld %lld",&i,&j);
			printf("%lld\n",a[i][j]);
		}
	}
	return 0;
}
 
 

2.不重复数字

C++中的set是一个集合容器,它存储唯一且已排序的元素。具体来说,set容器内部的元素总是按照一定的规则排好序的,而且这些元素必须是唯一的,即不允许存储重复的元素

//头文件
#include<set>
//初始化定义
set<int> s;
/*给定 n 个数,要求把其中重复的去掉,只保留第一次出现的数。
Input
本题有多组数据。
第一行一个整数 
T,表示数据组数。对于每组数据:
第一行一个整数 
n。

第二行 
n 个数,表示给定的数。
Output
对于每组数据,输出一行,为去重后剩下的数,两个数之间用一个空格隔开。*/
#include<cstdio>
#include<set>
using namespace std;
set<int>s;//构造一个容器 set,存储唯一的且已经排序的元素 
int main()
{
	int t,n,r,i,k;
	scanf("%d",&t);//组数 
	for(k=1;k<=t;k++)
	{
		scanf("%d",&n);//每组内元素个数 
		s.clear();//清空容器 
		scanf("%d",&r);//第一个元素 
		printf("%d",r);
		s.insert(r);//第一个元素插入到set 
		for(i=2;i<=n;i++)
		{
			scanf("%d",&r);//剩余元素 
			if(s.count(r)==0)//有该元素,s.count返回1 
			{
				printf(" %d",r);//没有的话,输出 
				s.insert(r);
			}	
		}
		printf("\n");
	}
	return 0;
} 
 

 3.文字处理软件

 学习:http://t.csdnimg.cn/HlzVt

在第二个那里卡了好久,还不是很理解


#include<stdio.h>
#include<string.h>
char search(char *s,char *t);
char temp[1000];
int main()
{
	char a[1110];
	char b[111];
	
	int n,m,i,l,r,k;

	scanf("%d",&n);
	scanf("%s",a);
	for(i=0;i<n;i++)
	{
		scanf("%d",&m);
		if(m==1)
		{
			//后接插入 
			scanf("%s",b);
			strcat(a,b);
			printf("%s\n",a);
		}else if(m==2)
		{
			//截取部分文档
			scanf("%d %d",&l,&r);
			a[l+r]='

4.ICPC Ballons

'; strcpy(temp, &a[l]); strcpy(a, temp); printf("%s\n",a); /*int y=strlen(a); l=l%y; r=r%y; for(int x=l;x<l+r;x++) { printf("%c",a[x]); } a[l+r]='#include<stdio.h> int main() { int n; scanf("%d",&n);//总的组数 while(n--) { int count=0;//计数器,每次清零 int m,i; char ch[1000]; char str[128]={0}; scanf("%d",&m);//第一组长度 scanf("%s",ch);//第一组字符 for(i=0;i<m;i++) { if(str[ch[i]]==0) { count=count+2; str[ch[i]]++; } else { str[ch[i]]++; count++; } } printf("%d\n",count); } return 0; }'; printf("\n");*/ }else if(m==3) { //前面插入 scanf("%d%s",&k,temp); strcat(temp,&a[k]);//temp和a的后半部分连接 a[k]='';//截取前面 strcat(a,temp);//连接前半部分和后面 printf("%s\n",a); }else if(m==4) { //查找子串 scanf("%s",temp); int x; x=search(a,temp); printf("%d\n",x); } } return 0; } char search( char *s, char *t ) { int i=0,j=0,k; for(i=0;s[i]!='';i++) { k=i; j=0;//每次比较都从t所指的第一个开始比较 while(s[k]==t[j]&&s[k]!=''&&t[j]!='') //判断时要考虑两个是否为,如果有一个是则跳出 { k++; j++; } if(j!=0&&t[j]=='') break; } if(s[i]!='') { return i; } else return -1; }

网易翻译的,沉默

参考:http://t.csdnimg.cn/k90N3

解题说明:用数组统计每个字母出现的个数,直接遍历,当字母第一次出现时加2,否则只加1。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明原文出处。如若内容造成侵权/违法违规/事实不符,请联系SD编程学习网:675289112@qq.com进行投诉反馈,一经查实,立即删除!