1. scanf和cin

scanf和printf是格式化输入输出,cinc和cout是输入输出流;

scanf比cin快的多,原因是:cin和stdin总是保持同步的,这种特性使得这两种方法可以混用,但这种特性也使得cin变得很慢,使用以下语句可以取消cin和stdin的同步:

1
2
ios::sync_with_stdio(false);
cin.tie(0);//使用此语句后,puts("");无法换行,原因未知

优点:提高cin的读取速度

缺点:不能同时使用scanf

2.字符串的读取

1.读取字符数组型字符串(cin, scanf) 使用fgets或cin.getline()

1
2
3
4
5
6
7
8
char s[100];
读取长度为7的字符串,包括末尾\0
fgets(s, 7, stdin)
//当读取位数小于第二个参数,会全部读取并在最后一个字符后面添加'\0',若读取的字符数等于n,则最多
//读取n-1个字符,第n个字符为'0'
//另:fgets不会过滤掉'\n',如果有剩余空间,则回车也会被读入

cin.getline(s, 7);

2.读取string型字符串(string不能用scanf读取) 使用getline

1
2
string s;
getline(cin, s);

3.二进制与十进制

1
2
3
4
5
6
补齐位数:补到八位或十六位或三十二位
①十进制正整数转化成二进制:除二取余,倒序排列,高位补零
②十进制负整数转化成二进制:先用正整数的方法表示,然后对二进制取反,再加一(也就是补码)。
③二进制整数转化成十进制:先补齐位数,看首位是0还是1
如果是0,说明是正整数,将二进制数每一位都乘2的位数次方,加起来即为十进制数
如果是1,说明是负整数,减1取反,然后算十进制数,然后加起来前面添负号

4.去重

用库函数去重

1
2
3
4
5
#include <algorithm>
vector<int> alls;//alls是需要去重的数组
sort(alls.begin(), alls.end());//将所有值排序
alls.erase(unique(alls.begin(), alls.end()), alls.end());//去掉重复元素
//unique会将所有元素的重复值放到最后,并返回去重后的新数组的尾段点,再用erase将尾端点到end的重复元素删除即可

5.主函数main可以递归

6.ascll码

1
’A'= 65;'a'=97;

7.#define和typedef

1
2
3
4
5
6
#define 类似于文本替换
#define read(x) scanf("%d", &x)//程序中所有的read(x)自动替换为scanf("%d", &x)
//——————————————————————————————————————————————————————————————————
typedef 可以自定义数据类型
typedef pair<int, int> PII
typedef long long LL

8.puts()

puts()可以用来输出字符串到屏幕上,很方便。

puts(“”);输出回车,换行

9.头文件

abs() 求绝对值 #include

sort() 快排 #include

lower_bound() 二分查找 #include

strcmp 比较字符串 #include

memset 初始化填充数组 #include

10.lower_bound和upper_bound

#include <algorithm>

pos = lower_bound(number, number + n, val) - number;//返回number数组中的下标位置

lower_bound 在first和last中的前闭后开区间内进行二分查找,返回大于或等于val的第一个元素位置,如果所有元素都小于val,则返回last的位置(是越界的)

pos = upper_bound(number, number + n, val) - number;

upper_bound 在first和last中的前闭后开区间内进行二分查找,返回大于val的第一个元素位置,如果所有元素都小于等于val,则返回last的位置(是越界的)

11.增强型for循环

1
2
3
4
5
6
//遍历字符串
for(char &c : str)//加上&,直接引用原字符进行遍历
for(char c : str)//不加&,复制一个str字符串进行遍历,因为要复制字符串,所以速度比上者慢
//遍历数组
for(auto &i : a)//同上
for(auto i : a)//同上

12.strcmp函数

include

strcmp(str1, str2) 比较两个字符串

如果返回值小于0,表示str1小于str2;

如果返回值大于0, 表示str1大于str2;

如果返回值等于0, 表示str1等于str2;

13.memset

填充,可用来初始化数组

memset(a, -1, sizeof a);//表示在a数组 中填充-1

14.无穷大

常用0x3f3f3f3f来表示无穷大

0x3f3f3f3f是一个很有用的数值,它是满足以下两个条件的最大整数。

1、整数的两倍不超过 0x7f7f7f7f,即int能表示的最大正整数。

2、整数的每8位(每个字节)都是相同的。

我们在程序设计中经常需要使用 memset(a, val, sizeof a) 初始化一个数组a,该语句把数值 val(0x00~0xFF)填充到数组a 的每个字节上,所以用memset只能赋值出“每8位都相同”的 int。

当需要把一个数组中的数值初始化成正无穷时,为了避免加法算术上溢出或者繁琐的判断,我们经常用 memset(a, 0x3f, sizeof(a)) 给数组赋 0x3f3f3f3f的值来代替。

15.生成随机数

公式:a + rand() % n; a为初始值,n为整数的范围

要取得[a,b)的随机整数,使用(rand() % (b-a))+ a;
要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a;
要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1;

16.左右对齐

c++中的输出默认是右对齐

设置左对齐:cout << setiosflags(ios::left) << … ;

右对齐同理

17.stringstream字符串流

可以将字符串读为任意格式

1
2
3
4
5
6
7
//头文件 #include <sstream>
string s = "123 abc 23 1.4";
stringstream ssin(s);
int a, b; string str; double c;

ssin >> a >> str >> b >> c;
cout << a << " " << str << " " << b << " " << c " ";

18.string的[]操作符只能访问不能赋值!!

19.atoi 和 stoi

atoi可以将一个char型 字符串转化成整数

stoi可以将一个string字符串转化成整数