String 类型和 int 类型转换

1. String -> int

1.使用stoi()

1
2
3
4
string s("12345");
long long a = stoi(s);
cout << a << endl;

2.使用atoi()

1
2
3
4
char str3[10] = "3245345";
//数字简单,所以转数字一个参数
long long a = atoi(str3);
cout << a << endl;

3.使用 sscanf() 映射

1
2
3
4
long long c = 0;
char str5[10] = "661234544";
sscanf(str5, "%d", &c); //从左至右,字符串转数字
cout << c << endl;

2.int -> String

1.使用 c++里的 to_string()

1
2
3
long long m = 1234566700;
string str = to_string(m); //系统提供数字转字符
cout << str << endl;

2.使用itoa()

1
2
3
4
5
int n = 100;
char str2[10];
//字符串比较麻烦,所以转字符串三个参数,我是这么记得(手动滑稽)
itoa(n,str2,10); //第一个参数为整数,第二个为字符串(char*),第三个为进制
cout << str2 << endl;

3.使用 sprintf() 映射

1
2
3
4
long long b = 1234560;
char str4[10] = {0};
sprintf(str4, "%d", b); //从右至左,把数转换为字符串
cout << str4 << endl;

判断字符类型

1、isalpha(x) 判断 x 是否为字母

2、isdigit(x) 判断 x 是否为数字

3、islower(x) 判断 x 是否为小写字母

4、isupper(x) 判断 x 是否为大写字母

5、isalnum(x) 判断 x 是否为字母或数字

6、ispunct(x) 判断 x 是否为标点符号

7、isspace(x) 判断 x 是否为空格

排序函数 sort

void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

(1)第一个参数 first:是要排序的数组的起始地址。

(2)第二个参数 last:是结束的地址(最后一个数据的后一个数据的地址)

(3)第三个参数 comp 是排序的方法:可以是从升序也可是降序。如果第三个参数不写,则默认的排序方法是从小到大排序。

元素自身包含了比较关系,如 int,double 等基础类型,可以直接进行比较 greater() 递减, less() 递增

1
2
3
4
5
int s[]={34,56,11,23,45};

vector<int>arr(s,s+5);

sort(arr.begin(),arr.end(),greater<int>());

元素本身为 class 或者 struct,类内部需要重载< 运算符,实现元素的比较;

求平方根

头文件:#include <math.h>

sqrt() 用来求给定值的平方根,其原型为:

double sqrt(double x);

判断数组长度

1.string 类型

  1. size() 个人比较常用

    1
    2
    string a = "abc";
    cout << a.size(); // a = 3

    2.length()

    1
    2
    string b = "abc";
    cout << b.length(); // b =3

2.char 类型

  1. strlen

    头文件是

    strlen 是一个函数,它用来计算指定字符串 str 的长度,但不包括结束字符(即 null 字符)

    1
    2
    3
    4
    5
    char s1[505];

    s1=123456;

    int la=strlen(s1);//a1=6
  2. sizeof

    实际上是得到的值是 类型长度 * 长度

    因为 char 的每个字符长 1,所以可以直接用

    但比如 int 每个字符长 4,得到的值为 4 * 长度

    会自动+1 是因为最后一个是 ‘\n’

    1
    2
    3
    4
    char str[]="hello world";
    cout << sizeof(str); //12
    int a[] = {1, 2, 3};
    cout << sizeof(a); // 12

求绝对值

abs() 是用来求整型表达式的绝对值

fabs() 是用来求浮点型表达式的绝对值

求次方

1. 数值较小,不求幂

pow() 函数用来求 x 的 y 次幂(次方),其原型为:

double pow(double x, double y);

pow()用来计算以 x 为底的 y 次方值,然后将结果返回。设返回值为 ret,则 ret = xy。

2.数值较大,求幂

快速幂

1
2
3
4
5
6
7
8
9
int qmi(int a, int k, int p){
int res = 1;
while(k){
if(k & 1) res = (LL)res * a % p;
k >>= 1;
a = (LL)a * a % p;
}
return res;
}

给全数组赋值

memset()函数原型是 extern void *memset(void *buffer, int c, int count)

buffer:为指针或是数组 c:是赋给 buffer 的值 count:是 buffer 的长度.

这个函数在 socket 中多用于清空数组.如:原型是 memset(buffer, 0, sizeof(buffer))

memset 用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’;

1
2
3
const int N = 100010;
int dist[N];
memset(dist, 0x3f, sizeof dist);

读取字符

1.读取到某个字符为止

getline

头文件:#include

istream& getline ( istream &is , string &str , char delim );

其中,istream &is 表示一个输入流,譬如 cin;

string&str 表示把从输入流读入的字符串存放在这个字符串中(可以自己随便命名,str 什么的都可以);

char delim 表示遇到这个字符停止读入,在不设置的情况下系统默认该字符为’\n’,也就是回车换行符(遇到回车停止读入)。

1
2
3
4
string line;
getline(cin, line, '#');
cout << line;
// 当我输入的是 YYDS#NoneVector,输出的是YYDS

2.读取到某个条件为止

循环输入,直到符合某种条件时结束输入。

1
2
3
4
5
6
int n;
while(cin >> n)
{
cout << n;
if(flag) break;
}

全排序

STL 提供了两个用来计算排列组合关系的算法,分别是 next_permutation 和 prev_permutation。首先我们必须了解什么是“下一个”排列组合,什么是“前一个”排列组合。考虑三个字符所组成的序列{a,b,c}。

这个序列有六个可能的排列组合:abc,acb,bac,bca,cab,cba。这些排列组合根据 less-than 操作符做字典顺序(lexicographical)的排序。也就是说,abc 名列第一,因为每一个元素都小于其后的元素。acb 是次一个排列组合,因为它是固定了 a(序列内最小元素)之后所做的新组合。

同样道理,那些固定 b(序列中次小元素)而做的排列组合,在次序上将先于那些固定 c 而做的排列组合。以 bac 和 bca 为例,bac 在 bca 之前,因为次序 ac 小于序列 ca。面对 bca,我们可以说其前一个排列组合是 bac,而其后一个排列组合是 cab。序列 abc 没有“前一个”排列组合,cba 没有“后一个”排列组合。

1.正序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int ans[4]={1, 2, 4, 3};
do
{
for(int i=0;i<4;++i)
cout<<ans[i]<<" ";
cout<<endl;
}while(next_permutation(ans,ans+4)); //与sort同理
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
1 2 4 3
1 3 2 4
1 3 4 2
1 4 2 3
1 4 3 2
2 1 3 4
2 1 4 3
2 3 1 4
2 3 4 1
2 4 1 3
2 4 3 1
3 1 2 4
3 1 4 2
3 2 1 4
3 2 4 1
3 4 1 2
3 4 2 1
4 1 2 3
4 1 3 2
4 2 1 3
4 2 3 1
4 3 1 2
4 3 2 1

2.逆序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int ans[4]={4, 3, 2, 1};
do
{
for(int i=0;i<4;++i)
cout<<ans[i]<<" ";
cout<<endl;
}while(prev_permutation(ans,ans+4));
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
4 3 2 1
4 3 1 2
4 2 3 1
4 2 1 3
4 1 3 2
4 1 2 3
3 4 2 1
3 4 1 2
3 2 4 1
3 2 1 4
3 1 4 2
3 1 2 4
2 4 3 1
2 4 1 3
2 3 4 1
2 3 1 4
2 1 4 3
2 1 3 4
1 4 3 2
1 4 2 3
1 3 4 2
1 3 2 4
1 2 4 3
1 2 3 4

大小写转换

1.toupper / tolower

1、toupper(x) 如果 x 是小写字母,将其转换成大写字母

2、tolower(x) 如果 x 是大写字母,将其转换成小写字母

非字母字符不做出处理

返回的值是 int 类型

1
2
3
string a = "aBc";
for(int i = 0; i < a.size(); i ++ ) a[i] = tolower(a[i]);
cout << a << endl;// a = abc

2.transform

1、如果使用 string 类,可以使用#include 里的如下方法进行大小写转换;

transform(str.begin(),str.end(),str.begin(),::tolower);

记得::tolower 前面有::, 而且是::tolower,不是::tolower()

1
2
3
4
5
6
7
8
string str;
cin>>str;
///转小写
transform(str.begin(),str.end(),str.begin(),::tolower);
cout<<"转化为小写后为:"<<str<<endl;
transform(str.begin(),str.end(),str.begin(),::toupper);
cout<<"转化为大写后为:"<<str<<endl;
return 0;

连接数组

1.string

直接相加

1
2
3
string a = "ab";
string b = "bc";
string c = a + b; // c = abbc

2. char

strcat 函数

其一般形式为:strcat(字符数组 1,字符数组 2)

strcat 的作用是连接两个字符数组中的字符串,把字符串 2 接到字符串 1 的后面,结果放在字符数组 1 中,函数调用后得到一个函数值——字符数组 1 的地址。

1
2
3
4
5
char str1[30]={″People′s  Republic  of  ″};
char str2[]={″China″};
printf(″%s″,strcat(str1,str2));
//输出:
//People′s Republic of China

复制数组

1.char

  1. strcpy 函数

    其一般形式为:strcpy(字符数组 1,字符串 2)

    strcpy 是“字符串复制函数”。

    作用:是将字符串 2 复制到字符数组 1 中去。例如:

    1
    2
    3
    4
    5
    6
    char str1[15],str2[]={"China2"};

    strcpy(str1,"china");
    cout << str1 << endl;//china
    strcpy(str1,str2);
    cout << str1 << endl;//China2

    (1)字符数组 1 必须定义得足够大,以便容纳被复制的字符串。字符数组 1 的长度不应小于字符串 2 的长度。

    (2)“字符数组 1”必须写成数组名形式(如 str1),

    “字符串 2”可以是字符数组名,也可以是一个字符串常量。如:strcpy(str1,″China″);

    (3)复制时连同字符串后面的′\0′一起复制到字符数组 1 中。

  2. strncpy 函数

    例如:strncpy(str1,str2,2);作用是将 str2 中前面 2 个字符复制到 str1 中去,然后再加一个‘\0’。

    1
    2
    3
    4
    5
    6
    char str1[15],str2[]={"China2"};

    strcpy(str1,"china");
    cout << str1 << endl;//china
    strncpy(str1,str2, 2);
    cout << str1 << endl;//China 大写C

比较字符串

strcmp 函数

其一般形式为:strcmp(字符串 1,字符串 2)

strcmp 的作用是比较字符串 1 和字符串 2。

例如:strcmp(str1,str2);

​ strcmp(″China″,″Korea″);

​ strcmp(str1,″Beijing″);

比较的结果由函数值带回

(1) 如果字符串 1=字符串 2,函数值为 0。

(2) 如果字符串 1>字符串 2,函数值为一正整数。

(3) 如果字符串 1<字符串 2,函数值为一负整数。