算法课上完了,估量着以后应该也不会怎么使用C++了,整理一下C++的一些使用上的经验技巧,该总结主要参考了一下文章/网站,首先对他们的工作成果表示感谢!
1、 @mannhello的文章:c++容器简介与比较
2、 原作者未知的文章:C++中几个容器的比较
3、 神一般的C++库函数资料网站:www.cplusplus.com,总结超级全面的,很值得一看
再次对他们的工作成果表示感谢!
如果发现任何错漏之处还请告知,感激不尽!
转载请注明出处,谢谢!
1 概述
首先是一些有关C++的使用技巧:
(1) 做算法题的时候切记换行与空格,避免低级错误;
(2) 一旦某道题出现超时,如果你是用的是cin/cout,首先在main()函数第一行添加std::ios::sync_with_stdio(false);取消同步,如果还不能解决则把所有的cin/cout转换成C风格的scanf/printf;
(3) 做算法题的时候但凡排序都可以使用库函数:#include<algorithm> sort();
对于结构体的大小关系你可以为其编写专门的cmp方法传入即可;
(4) 数组初始化可以这样:
#include <memory.h>
int a[100];
memset(a, 0, sizeof(int)*100); //把数组a的每个字节都赋值为“0”
memset(a, 1, sizeof(int)*100); //这样是不行的,会把一个int的每个字节都赋值为“1”,最后数组里存储的是16843009(1 00000001 00000001 00000001);
(5) 对于浮点数比较,需要用一点技巧:
a > b:a > b + (1e-6)
a >=b:a > b – (1e-6)
a < b:a < b – (1e-6)
a <= b:a < b + (1e-6)
a == b:a > b – (1e-6) && a < b + (1e-6)
(6) 对精度要求比较高的时候,你可以这样获得 :#include <math.h> pi=acos(-1, 0);
(7) 如果需要自定义输入输出测试数据,可以重定向数据流到文件:
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
之后使用的cin/cout都会从文件读取了;
(8) 对于大数的模,为了避免溢出可以用这个公式:(X*X % M) = (X%M * X%M) % M;
(9) 字符串转换数字:
#include <stdlib.h>
char c[5];
string s;
int n = atoi(c); int n =atoi(s.c_str()); //atoi()会扫描参数nptr字符串,如果第一个字符不是数字也不是正负号返回零,否则开始做类型转换,之后检测到非数字或结束符 /0 时停止转换,返回整型数。
long n = atol(c); long n =atol(s.c_str); //atol()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('/0')才结束转换,并将结果返回。
double n = atof(c); double n = atof(s.c_str); //atof()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时 ('/0')才结束转换,并将结果返回。参数nptr字符串可包含正负号、小数点或E(e)来表示指数部分,如123.456或123e-2。
(10) 对于一个字符集合,你可以这样获得他的全排列:
#include<algorithm>
string str;
do{
…..//取得当前str在全排列中的下一个字符串,直接使用str即可
}while(next_permutation(str.begin(), str.begin() + str.length()));
(11) 对于两个案例之间换行或空格的要求,可以这样子:
bool ok = false;
while(case){
if(ok) cout << endl;
ok = true;
……
}
(12) 当题目出现一些类似“N个点,N-1条边,无环”“N个点,N-1条边,任意两点联通”“N个点,任意两点简单连通”,说明题目中的N就是一棵树;
(13) 如果一道题的复杂度在10^8以内,用暴力枚举也没关系;
(14) 对于搜索,如果已知最多步数,则可以使用DFS获得所有路径(递归);如果要求最少步数,则可以使用BFS(队列);
2 容器
2.1 所有容器共有函数及属性
2.1.1 容器中常用typedef
以下这些typedef常用于声明变量、参数和函数返回值:
(1) value_type 容器中存放元素的类型
(2) reference 容器中存放元素类型的引用
(3) const_reference 容器中存放元素类型的常量引用,这种引用只能读取容器中的元素和进行const操作
(4) pointer 容器中存放元素类型的指针
(5) iterator 指向容器中存放元素类型的迭代器
(6) const_iterator 指向容器中存放元素类型的常量迭代器,只能读取容器中的元素
(7) reverse_iterator 指向容器中存放元素类型的逆向迭代器,这种迭代器在容器中逆向迭代
(8) const_reverse_iterator 指向容器中存放元素类型的逆向迭代器,只能读取容器中的元素
(9) difference_type 引用相同容器的两个迭代器相减结果的类型(list和关联容器没有定义operator-)
(10) size_type 用于计算容器中项目数和检索顺序容器的类型(不能对list检索)
2.1.2 所有标准库共有函数(除适配器外):
(1) 构造器及析构器
a) C<T> a;
//默认构造函数,初始化为空
b) C<T> a(a0);
//复制构造函数,初始化微现有同类容器副本
c) C<T> a(iter1,iter2);
//复制构造函数,初始化为现有同类容器的一部分
d) ~C<T>();
//析构函数
(2) 迭代器