文章目录
一 容器
每个容器都提供了很多方法,这里只介绍最适用于这种数据结构的一些方法,并且在做题时候会常用的一些方法。
1.vector
vector 容器和数组是一样的,基本上除非题目输入定义了vector类型,自己也不太会引入vector。毕竟要多打很多字。
//定义:
vector <int> v;
//访问:
v[i];
//更新
v[i]=a;
//大小
v.size();
//末尾插入
v.push_back(a);
//末尾删除
v.pop_back();
//清空
v.clear();
//判断空
v.empty();
//排序
sort(v.begin(),v.end());//从小到大
sort(v.rbegin(),v.rend());//从大到小
//自定义排序
bool compare(int a,int b)
{
return a< b; //升序排列,如果改为return a>b,则为降序
}
sort(v.begin(),v.end(),compare);
//翻转
reverse(v.begin(),v.end());
2.stack
stack是栈,用数组加一个指示下标的变量也可以模拟stack,引入容器可以节省指示变量的处理,以及预防一些越界的问题。Stack 主要任务就是进栈出栈
//定义
stack<int> s;
//入栈
s.push(i);
//出栈
s.pop();
//栈顶元素
s.top();
//判空
s.empty();
//大小
s.size();
3.queue, deque
双端队列包含了队列的功能,所以一般直接用Deque,以防写着写着需要有变化。
//定义
deque<int> d;
//增加头元素
d.push_front(i);
//增加尾元素
d.push_back(i);
//访问头元素
d.front();
//访问尾元素
d.back();
//删除头
d.pop_front();
//删除尾
d.pop_back();
//判空
d.empty();
//长度
d.size();
4. set,multiset
set主要作用是自动去重,对于期望得到不重复的结果,使用set维护输出列表。由于set,multiset通过平衡二叉树实现,有自动排序功能。set不允许重复,multiset允许重复
//定义
set<int> s;
//添加元素
s.insert(i);
//删除元素
s.erase(i);
//查找元素 返回指针
s.find(i);
//大小
s.size();
//遍历
for(set<int>::iterator it=s.begin(); it!=s.end();it++)
{
cout<<*it<<endl;
}
//范围查找
m.lower_bound(elem);
m.upper_bound(elem);
5. map,multimap,hashmap
map是一个使用键值对key-value 模式的容器,map不允许重复键值,而multimap允许重复键值。适用于词频统计类的问题。map的底层是红黑树。
hashmap操作与map相同,但是底层是hash表,可以在O(1)时间内完成访问操作。
//定义
map<char*, int> m;
//插入
m.insert(pair<char *, int>(key,value))
m[key]=value;
//删除
m.erase(key);
//访问
m[key];//如果没有这个key,则返回0
//遍历
for(map<char *,int>::iterator it=m.begin();it!=m.end();it++)
{
cout<<it->first<<" "<<it->second<<endl;
}
//大小
m.size();
//清空
m.clear();
二 常用类
1. string
//构造
string s="123";
char *a="123";
string s = a;
//拼接
a+b
//子串
a.substr(1,2);
//查找
a.find("12");//返回字串第一个字符的下标,如果没有找到,返回string::npos
//替换
a.replace(1,2,"ab"); //ab3
//删除子串
a.erase(1,2); //3
//长度
a.size();
//访问
a[i];
//转成char *
a.c_str();
三 常用函数
1. sort()
int a[5]={3,1,3,5,2};
sort(a,a+5);
//自定义cmp
bool cmp(int a,int b){
return a>=b; //可以理解为当a>b时,把a放在前面
}
sort(a,a+5,cmp);
2. next_permutation()
int a[5]={1,3,2};
do
{
for (int i=0;i<3;i++)
cout<<a[i];
cout<<endl;
}while (next_permutation(a,a+3));
//output:
132
213
231
312
321
3. strtok()
char sentence[]="This is a sentence with 7 tokens";
char *tokenPtr=strtok(sentence," ");
while(tokenPtr!=NULL) {
cout<<tokenPtr<<'\n';
tokenPtr=strtok(NULL," ");
}
4. atoi(), atol(), atof()
字符串转换成数字
atoi("123");
atol("123456789");
atof("123.888");
5. sprintf()
数字转换成字符串
sprintf(s,"%d", 123);
6. strtol()
进制转换
char * stop;
cout<<strtol("1234", &stop, 7)<<endl;
7. distance()
返回迭代器之间的距离
distance(list1.begin(),list1.end());
8. merge() & inplace_merge()
merge() 算法会合并两个序列并将结果保存到第三个序列中,它使用 < 运算符来比较元素。图 1 表明合并操作被运用到 these 和 those 容器的内容上,结果序列保存在 both 容器中。
inplace_merge() 算法可以合并同一个序列中两个连续有序的元素序列。它有三个参数: first、second、last 和 last 是一个双向迭代器。这个序列中的第一个输入序列是 [first,second), 第二个输入序列是 [second,last),因而 second 指向的元素在第二个输入序列中。结果为 [first, last)。
merge
int a[5]={1,3,5,7,9};
int b[5]={2,4,6,8,10};
int c[10]={0};
merge(a,a+5,b,b+5,c);
for (int i=0;i<10;i++)
cout<<c[i]<<" ";
inplace_merge
int a[10]={1,3,5,7,9,2,4,6,8,10};
inplace_merge(a,a+5, a+10);
for (int i=0;i<10;i++)
cout<<a[i]<<" ";
9.max_element(), min_element()
返回一个指向最大(小)的元素的指针
int a[10]={1,3,5,7,9,2,4,6,8,10};
int * ans1=max_element(a,a+10);
int * ans=min_element(a,a+10);
cout<<*ans1<<endl;
cout<<*ans<<endl;
四 常用自定义函数
1. 判断是否是质数
考虑效率,最快的方式是去网上拉素数表,一般1000以内就可以
#include <math.h>
int prime_list[] ={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997};
bool is_prime(int n)
{
for (int i=0;i<168;i++)
{
if (n%prime_list[i]==0)
return false;
if (prime_list[i]>int(sqrt(n))
break;
}
return true;
}
2. 判断是否互质,求最大公因数
辗转相除法, 最大公因数是1就是互质。
#include <algorithm>
int gcd(int a, int b)
{
if (a<b) swap(a,b);
while(a!=0)
{
a = a % b;
if (a!=0)
swap(a,b);
}
return b;
}