0%

C++相关知识

1、预处理器指示符

当嵌套包含文件时可以用如下代码避免重复编译。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef BOOKSTORE_H
#define BOOKSTORE_H
/* Bookstore.h 的内容 */
#endif

/*
#ifndef x 判断x是否被定义,若x未被定义则为真,否则为假。
...
#endif 标志#ifndef的结束

#ifdef x 判断x是否被定义,若x未被定义则为假,否则为真。

#define x 定义x。
*/

一些预定义名字:

1
2
3
4
5
6
7
8
9
10
11
/*
__cplusplus:编译 C++程序时 编译器自动定义的名字,用来判断该程序是不是C++程序。
__STDC__:在编译标准 C 时 编译器将自动定义的名字,用来判断该程序是不是C程序。
__LINE__:记录文件已经被编译的行数。
__FILE__:包含正在被编译的文件的名字。
__TIME__:当前被编译文件的编译时间
__DATE__:当前被编译文件的编译日期

若当前处理的行或文件发生变化 则__LINE__和__FILE__的值将分别被改变 其他四个
预定义名字在编译期间保持不变 它们的值也不能被修改
*/

2、二维数组指针

二维数组 a[2][3] 指针表示

方法一:

int (*p)[3]=aint (*p)[3]=&a[0]

访问 a[i][j] 等价于 p[i][j]*(*(p+i)+j)

方法二:

int *p=a[0]=&a[0][0]=*a

访问 a[i][j] 等价于 *(p+i*C+j)*(*(p+i)+j)

3、pair 用法

类模板:template<class T1,class T2> struct pair

参数:T1是第一个值的数据类型,T2是第二个值的数据类型。

功能:pair将一对值(T1和T2)组合成一个值,这一对值可以具有不同的数据类型(T1和T2), 两个值可以分别用pair的两个公有函数first和second访问。

1
2
3
4
5
6
7
pair<T1,T2> p1; //创建一个空的pair对象,元素类型分别为T1,T2。
pair<T1,T2> p2(v1,v2);//创建一个pair对象,元素的值分别为v1,v2。
make_pair(v1,v2);//以v1,v2的值创建一个pair对象,类型分别为v1,v2的类型
p1<p2;//小于比较,先first后second。
p1==p2;//等于比较,先first后second。
p1.first;//返回p1中的第一个值。
p1.second;//返回p1中的第二个值。

可以预定义宏

1
2
3
4
5
typedef pair<T1,T2> P;
//三种定义方式
P p1(v1,v2);
P p = P(v1,v2);
P p = make_pair(v1,v2);

可以通过tie获取pair元素值,std::tie位于tuple头文件中

1
2
3
4
5
6
#include <tuple>
typedef pair<T1,T2> P;
P p(v1,v2);
T1 v3;
T2 v4;
tie(v3,v4)=p;

4、队列(queue)

std::queue位于 queue头文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<queue>
queue<T> Q; //定义一个类型为T的队列
//常用函数
//访问第一个元素
T e=Q.front();
//访问最后一个元素
T e=Q.back();
//检查队列是否为空
bool b=Q.empty();
//返回队列中元素的个数
int s=Q.size();
//将元素e插入队列尾部
Q.push(e);
//删除栈顶元素
Q.pop();
//于尾部原位构造元素
Q.emplace(e);

5、字符串(string)

std::string 位于string头文件

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
#include<string>

//string 可以直接赋值
str = "This is a string.";

//访问字符串元素
char ch = str[0];

//获取字符串长度
int l = str.length();

//向末尾添加
str += "A new string.";

//字符串比较(==,!=,<,>,<=,>=,<=>都可以直接使用)
b = (str <= "Another string.");
b = (str >= "Another string.");
b = (str == "Another string.");
//cpm <0 : str的字典序小 cpm >0 :str的字典序大
int cpm = str.compare("Another string.");

//获取子串(pos表示开始位置,count表示子串的长度)
string subs = str.substr(pos,count);

//string转char数组(count表示子串长度,pos表示开始位置)
str.copy(s,count,pos);

//查找字符出现的位置(ch表示要搜索的字符,pos表示开始位置)返回ch第一次出现的位置,若没有则返回-1
pos = str.find(ch,pos);

//输入输出
cin>>string; cout<<string;
//读取一整行(包含空格字符串)
getline(cin,string);

//数值转换
int int1 = stoi(string);
long long1 = stol(string);
long long long_long1 = stoll(string);
string str1 = to_string(int);
string str1 = to_string(double);

6、映射(map)

std::mapmap头文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<map>
map<int,int> mp;

//清空
mp.clear();

//大小
mp.size();

//插入键值对
mp[key]=value;

//顺序遍历
for(auto it = mp.begin();it!=mp.end();++it)
{
int key = it->first;
int calue = it->second;
}

//判断key是否在map中
auto it = mp.find(key);
if (it!=mp.end()) //key在map中
else //key不在map中,it即为其所在地址

7、cout用法

1、cout保留小数

1
2
3
4
#include<iomanip>

cout<<fixed<<setprecision(2)<<b<<endl;//保留2位小数
cout<<setprecision(2)<<b<<endl;//保留2位有效数字

8、自定义结构体(struct)

1、结构体变量构造函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct Student
{
char *name;
int age;
char *sex;
Student(char *name,int age,char *sex)
:name(name),age(age),sex(sex){}
void print_info()
{
cout<<"name: "<<name<<endl;
cout<<"age: "<<age<<endl;
cout<<"sex: "<<sex<<endl;
}
};

Student stu = Student("张三",18,"男");
stu.print_info();

9、STL中的二分查找

查找某个元素是否出现过。

1
2
3
4
5
6
7
8
#include <algorithm>

int a[]={1,2,3,4,5,6,7,8};
// binary_search(开始位置,结束位置,要查找的值);
bool f = binary_search(a,a+8,6);

vector<int> b={1,2,3,4,5,6,7,8};
bool f = binary_search(b.begin(),b.end(),4);

2、lower_bound

查找第一个大于等于某个元素的位置。如果没找到返回结束位置。

1
2
3
4
5
6
7
8
#include <algorithm>

int a[]={1,2,3,4,5,6,7,8};
// lower_bound(开始位置,结束位置,要查找的值);
int pos = lower_bound(a,a+8,7)-a;

vector<int> b={1,2,3,4,5,6,7,8};
auto it= lower_bound(b.begin(),b.end(),5);

3、upper_bound

查找第一个大于某个元素的位置。如果没找到返回结束位置。

1
2
3
4
5
6
7
8
#include <algorithm>

int a[]={1,2,3,4,5,6,7,8};
// upper_bound(开始位置,结束位置,要查找的值);
int pos = upper_bound(a,a+8,11)-a;

vector<int> b={1,2,3,4,5,6,7,8};
auto it= upper_bound(b.begin(),b.end(),5);

10、读取一整行

1
2
3
#include<cstdio>
char str[10];
scanf("%[^\n]",str);