技巧及优化
1. scanf和cin
scanf和printf是格式化输入输出,cinc和cout是输入输出流;
scanf比cin快的多,原因是:cin和stdin总是保持同步的,这种特性使得这两种方法可以混用,但这种特性也使得cin变得很慢,使用以下语句可以取消cin和stdin的同步:
| 1 | ios::sync_with_stdio(false); | 
优点:提高cin的读取速度
缺点:不能同时使用scanf
2.字符串的读取
1.读取字符数组型字符串(cin, scanf) 使用fgets或cin.getline()
| 1 | char s[100]; | 
2.读取string型字符串(string不能用scanf读取) 使用getline
| 1 | string s; | 
3.二进制与十进制
| 1 | 补齐位数:补到八位或十六位或三十二位 | 
4.去重
用库函数去重
| 1 | #include <algorithm> | 
5.主函数main可以递归
6.ascll码
| 1 | ’A'= 65;'a'=97; | 
7.#define和typedef
| 1 | #define 类似于文本替换 | 
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 | //遍历字符串 | 
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 | //头文件 #include <sstream> | 
18.string的[]操作符只能访问不能赋值!!
19.atoi 和 stoi
atoi可以将一个char型 字符串转化成整数
stoi可以将一个string字符串转化成整数





