cpp常用函数

本篇旨在记录算法学习过程中所遇所用到的c/c++函数及技巧 以备复习

C++ String类

常见函数:

  • 插入: insert(位置,待插入字符串)

  • 删除: erase(pos , len) pos
    表示要删除的子字符串的起始下标,len 表示要删除子字符串的长度。如果不指明 len 的话,那么直接删除从 pos 到字符串结束处的所有字符(此时 len = str.length - pos)。

  • 提取字符串:string substr (size_t pos = 0, size_t len = npos) const;

    pos 为要提取的子字符串的起始下标,len 为要提取的子字符串的长度。

  • 字符串查找

    1. find():第一个参数为待查找的子字符串,它可以是 string 字符串,也可以是C风格的字符串。第二个参数为开始查找的位置(下标);如果不指明,则从第0个字符开始查找。
    2. rfind():rfind() 和 find() 很类似,同样是在字符串中查找子字符串,不同的是 find() 函数从第二个参数开始往后查找,而 rfind() 函数则最多查找到第二个参数处,如果到了第二个参数所指定的下标还没有找到子字符串,则返回一个无穷大值4294967295。
    3. find_first_of():find_first_of() 函数用于查找子字符串和字符串共同具有的字符在字符串中首次出现的位置

      例:
      1
      2
      3
      4
      5
      6
      7
      string s1 = "first second second third";
      string s2 = "asecond";
      int index = s1.find_first_of(s2);

      运行结果:
      Found at index : 3
      本例中 s1s2 共同具有的字符是 ’s’,该字符在 s1 中首次出现的下标是3,故查找结果返回3
  • 数值转换 链接

  • 其他用法 链接

string数值转换

char转string

格式化输出

格式字符有d,o,x,u,c,s,f,e,g等。 

  • %d:就是普通的输出

  • %2d:是将数字按宽度为2,采用右对齐方式输出,若数据位数不到2位,则左边补空格

  • %02d:和%2d差不多,只不过左边补0

  • %d: 整型输出,%ld长整型输出,

  • %o: 以八进制数形式输出整数,

  • %x: 以十六进制数形式输出整数,或输出字符串的地址。

  • %u: 以十进制数输出unsigned型数据(无符号数)。注意:%d与%u有无符号的数值范围,也就是极限的值,不然数值打印出来会有误。

  • %c: 用来输出一个字符,

  • %s: 用来输出一个字符串,

  • %f: 用来输出实数,以小数形式输出,默认情况下保留小数点6位。

  • %.100f: 用来输出实数,保留小数点100位。

  • %e:以指数形式输出实数,

  • %g:根据大小自动选f格式或e格式,且不输出无意义的零

技巧

判断素数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bool IsPrime(int n)
{
if(n <= 1){
cout<<n<<"不是素数"<<endl;
return false;
}
for (int i = 2; i < n; i++)
{
if ((n % i) == 0){
cout<<n<<"不是素数"<<endl;
return false;
}
}
cout<<n<<"是素数"<<endl;
return true;
}

判断闰年

1
2
3
4
5
6
7
int isRunyear(int x)
{
if(x%100!=0&&x%4==0||x%400==0)
return 1;
else
return 0;
}

日期模版

题目描述:有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int isRunyear(int x)
{
if(x%100!=0&&x%4==0||x%400==0)
return 1;
else
return 0;
}
//0代表不是闰年 28天 1 29天
int month[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}};
struct Date{
int Day;
int Month;
int Year;
void nextDay(){
Day++;
int isrun=isRunyear(Year);
if(Day>month[isrun][Month])
{
Day=1;
Month++;
if(Month>12)
{
Month=1;
Year++;
}
}

}
};
int buf[5001][13][32]; //保存预处理的天数

int main()
{
Date tmp;
int cnt=0;//记录天数插值
tmp.Year=0;
tmp.Month=1;
tmp.Day=1;
while(tmp.Year!=5000)
{
buf[tmp.Year][tmp.Month][tmp.Day]=cnt;
tmp.nextDay();
cnt++;
}
int Y1,M1,D1;
int Y2,M2,D2;
while(scanf("%4d%2d%2d",&Y1,&M1,&D1)!=EOF)
{
scanf("%4d%2d%2d",&Y2,&M2,&D2);
printf("%d\n",abs(buf[Y2][M2][D2]-buf[Y1][M1][D1])+1);
}

return 0;
}

判断星期几

利用基姆拉尔森计算日期公式 w=(d+2m+3(m+1)/5+y+y/4-y/100+y/400)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>

const char * getWeekdayByYearday(int iY, int iM, int iD)
{
int iWeekDay = -1;
if (1 == iM || 2 == iM)
{
iM += 12;
iY--;
}
iWeekDay = (iD + 1 + 2 * iM + 3 * (iM + 1) / 5 + iY + iY / 4 - iY / 100 + iY / 400) % 7;
switch(iWeekDay)
{
case 0 : return "Sunday"; break;
case 1 : return "Monday"; break;
case 2 : return "Tuesday"; break;
case 3 : return "Wednesday"; break;
case 4 : return "Thursday"; break;
case 5 : return "Friday"; break;
case 6 : return "Saturday"; break;
default : return NULL; break;
}

return NULL;
}

int main()
{
int year,month,day;
char ch='1';
while(ch != '\033')
{
printf("\n请输入日期:\n格式为:1900,1,1\n");
scanf("%d,%d,%d",&year,&month,&day);
const char * p = getWeekdayByYearday(year, month, day);
printf("WeekDay : %s\n", p);
ch = getchar();
printf("\n");
}
}

Repeater



代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string.h>
using namespace std;

char map[3003][3003];
char str[6][6];
int n;

void dfs(int m, int x, int y){
if (m == 1){
for (int i = 0; i<n; i++)
for (int j = 0; j<n; j++)
map[x + i][y + j] = str[i][j];
return;
}
int size = (int)pow(n*1.0, m - 1);
for (int i = 0; i<n; i++){
for (int j = 0; j<n; j++){
if (str[i][j] != ' ')
dfs(m - 1, x + i*size, y + j*size);
}
}
}

int main(void){
n = 1;
while (n){
cin >> n;
getchar();
for (int i = 0; i < n; i++){
cin.getline(str[i],6);
}
int m;
cin >> m;
int size = (int)pow(n*1.0, m);
for (int i = 0; i<size; i++){
for (int j = 0; j<size; j++)
map[i][j] = ' ';
map[i][size] = '\0';
}
dfs(m, 0, 0);
for (int i = 0; i<size; i++)
cout<<map[i]<<endl;
}
return 0;
}

二分搜索模版

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
while(base<=top)
{
int mid=(base+top)/2;
if(a[mid].xuehao==x)
{
flag=1;
cout<<a[mid].xuehao<<" "<<a[mid].name<<" "<<a[mid].xingbie<<" "<<a[mid].age<<endl;
break;
}
else{
if(a[mid].xuehao>x)
{
top=mid-1;
}else{
base=mid+1;
}
}

}

矩阵旋转

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void swap(int* a, int* b)
{
int t = *a;
*a = *b;
*b = t;
}

// 逆时针旋转
void transpose(int a[][4], int n)
{
for (int i = 0; i < n; i++)
for (int j = i+1; j < n; j++)
swap(a[i][j], a[j][i]);
for (int i = 0; i < n / 2; i++)
for (int j = 0; j < n; j++)
swap(a[i][j], a[n - 1 - i][j]);
}

// 顺时针旋转
void clockwise(int a[][4], int n)
{
for (int i = 0; i < n; i++)
for (int j = 0; j < n - i; j++)
swap(a[i][j], a[n - 1 - j][n - 1 - i]);
for (int i = 0; i < n / 2; i++)
for (int j = 0; j < n; j++)
swap(a[i][j], a[n - 1 - i][j]);
}


cpp常用函数
https://shanhainanhua.github.io/2021/02/08/cpp常用函数/
作者
wantong
发布于
2021年2月8日
许可协议