当前位置:编程学习 > C/C++ >>

C++学习笔记汇总

    算法课上完了,估量着以后应该也不会怎么使用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)      迭代器
 
a)  
补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,