C++
数据范围
int $ -2.14\times10^9 \sim 2.14\times10^9$
unsigned int $0\sim4.29 \times10^ 9$
long long $-9.22\times10^{18}\sim9.22 \times10^ {18}$
unsigned long long $0\sim1.84 \times10^ {19}$
float $-3.40\times10^{38}\sim3.40 \times10^ {38}$ 6~7
double $-1.79\times10^{308}\sim1.79 \times10^ {308}$ 15~16
long double $-1.2\times10^{4932}\sim1.2\times10^{4932}$ 18-19
易错点
$memset$ 只管后面的两个字符,然后前面的直接就复制过去, 所以 $memset( a,0x3f,sizeof(a) )$ 效果等同于 $memset( a,0x3f3f3f3f,sizeof(a) )$
$strlen()$ 的时间复杂度为 $\mathcal{O}(n)$
$s.size()$ 的返回值为 $unsigned long$
动态数组
1 | int *a = new int[50]; |
IO
scanf
1 | %f float |
printf
1 | - 左对齐 |
整行读入
1 | //scanf()读入char[] |
文件输入输出
1 | freopen("/Users/perpeternal/Downloads/test.in", "r", stdin); |
可变参数
1 | void out(int count,...){ |
手动优化
手动加栈
1 |
优化
-O0 表示无优化状态
-O1 表示对代码进行了优化
-O2 表示减小目标文件大小
-O3 表示减小代码段及栈空间的大小
全局:
1 |
部分:
1 |
|
随机数
1 | //这是两个预定义类(类型),定义的变量可以用重载好的 () 运算符获取随机数 |
assert
1 | assert(0); //终止程序,报re |
inf&nan
1 | int isfinite(x); 判断x是否有限,是返回1,其它返回0; |
bitset
1 | bitset<4> bitset1; //无参构造,长度为4,默认每一位为0 |
priority_queue
1 | //在结构体外重载结构体小于运算符 |
vector
1 | vector<int>v1; |
set & map
set
1 | struct node{ |
map
1 | typedef struct UrlKey |
unordered_set
1 | struct node{ |
multiset
1 |
|
string
1 | string s(str) //拷贝构造函数 生成str的复制品 |
编译过程
compile
test.cpp - 预处理(Pre-processing) - test.i - 编译(Compiling) - test.s - 汇编(Assembling) - test.o - 链接(Linking) - test
Pre-processing
-E 选项使用g++/gcc将源代码预处理后不执行其他动作。
下面的命令将test.cpp预处理,并在标准输出中显示:
1 | g++ -E test.cpp |
后面加上 -o 选项表示将源代码预处理后输出在指定文件中,比如test.i:
1 | g++ -E test.cpp -o test.i |
Compiling
-S 选项使用g++/gcc将预处理后的文件编译,翻译成汇编代码。只编译不汇编
下面的命令将会编译test.i文件,并自动在当前文件夹生成test.s文件
1 | g++ -S test.i |
若要指定其他输出名,则需 -o 指定,比如生成名为xxx.s的汇编代码文件
1 | g++ -S test.i -o xxx.s |
Assembling
-c 选项将编译生成的test.s文件生成二进制目标代码
下面的命令将在当前文件夹自动生成test.o的二进制目标代码文件
1 | g++ -c test.s |
如果要指定输出文件名,则需 -o 指定,比如生成xxx.o的二进制目标代码文件
1 | g++ -c test.s -o xxx.o |
Linking
链接阶段是将相关的目标文件链接起来,形成一个整体,生成可执行文件
无选项链接
下面的命令会把二进制目标文件test.o所需的相关文件链接成一个整体,并在当前文件夹自动生成一个名为a.out的可执行文件
1 | g++ test.o |
如果要执行这个可执行文件,需要输入命令
1 | ./a.out |
当然也可以指定生成的可执行文件的文件名
1 | g++ test.o -o test.exe |
单个源文件直接生成可执行文件
当然g++/gcc也可以直接把源代码直接生成可执行文件
下面的命令将test.cpp直接在当前文件夹生成a.out可执行文件,若要指定文件名,可使用 -o 选项
1 | g++ test.cpp |
多个源文件直接生成可执行文件
也可以将多个源代码编译链接成一个可执行文件
下面的命令将test.cpp直接在当前文件夹生成a.out可执行文件,若要指定文件名,可使用 -o 选项
1 | g++ test1.cpp test2.cpp |
使用C++11标准编译
如果要使用C++11版本特性,则需要使用 -std=c++11 选项
1 | g++ -std=c++11 test.cpp -o test.exe |