一、基础篇

C++标准模板库(STL)

1.vector

可以理解为“变长数组”

  1. #include <vector>
  2. vector<typename> name;
  3. vector<vector<int> > name; //两个维都可变长的二维数组 >>之间要加空格
  4. vector<typename> Arrayname[arraySize]; //Arrayname[0]~Arrayname[arraySize-1]中每一个都是一个vector容器
  • .size() 获取vector中元素的个数,返回unsigned类型

  • .clear()

  • .push_back(x) 在vector后面添加一个元素x

  • .pop_back() 删除vector的尾元素

  • .insert(it, x) 向vector的任意迭代器it处插入一个元素x

  • 通过下标访问: vi[0] ~ vi[vi.size()-1]

  • 通过迭代器访问

  1. for(vector<int>::iterator it = vi.begin(); it!=vi.end(); it++){
  2. printf("%d ", *it);
  3. }
  4. //end()是尾元素地址的下一个地址
  • .erase():删除一个元素、删除一个区间内的所有元素

  1. vi.erase(it); //删除迭代器为it处的元素
  2. vi.erase(a, b); //删除[a,b)内所有元素

2.set

集合,是一个内部自动有序且不含重复元素的容器

  1. #include <set>
  2. set<typename> name;
  3. set<typename> Arrayname[arraySize]; //Arrayname[0]~Arrayname[arraySize-1]中每一个都是一个set容器
  4. //遍历
  5. for(set<int>::iterator it = name.begin(); it!=name.end(); it++){
  6. //骚操作
  7. if(name.find(*it) != name.end()){//怎么判断查找到
  8. }
  9. }
  • set容器内的元素只能通过迭代器访问

  • .size()

  • .clear()

  • .insert(x)将x插入set容器中,并自动递增排序和去重

  • .find(value) 返回set中对应值为value的迭代器

  • .erase():删除单个元素、删除一个区间内的所有元素

3.string

  1. #include <string>
  2. string str;
  3. string str = "abcd";
  4. //如果要读入和输出整个字符串,则只能用 cin 和 cout
  • 可以通过迭代器 或 下标访问

  • operator+=

  1. str3 = str1 + str2;
  2. str1 += str2;
  • compare operator 比较规则是字典序

    ==、!=、<、<=、>、>=

  • .length() / .size() 返回string的长度

  1. string str = "abcxyz";
  2. printf("%d %d\n", str.length(), str.size());
  3. //输出 6 6
  • .insert()

  1. str.insert(pos, str2); //在pos号位置插入字符串str2,str2处直接"..."也行
  2. string str = "abcxyz", str2 = "opq";
  3. str.insert(str.begin()+, str2.begin(), str2.end());//在str的3号位(即c和x之间)插入str2
  • .erase() //str.erase(pos, length) pos为开始删除位置,length为删除的字符个数

  • .clear()

  • .substr(pos, len) 返回从pos号位开始、长度为len的子串

  • str.find(str2) 当str2是str的子串时,返回其在str中第一次出现的位置;若不是,那么返回string::npos(-1或4294967295)

  • str.replace(pos, len, str2) 把str从pos号位开始、长度为len的子串替换为str2

    str.replace(it1, it2, str2) 把迭代器[it1,it2)范围的子串替换为str2

4.map

映射,键值对,键唯一;

map会以键从小到大的顺序自动排序

  1. #include <map>
  2. map<typename1, typename2> mp;
  3. map<string, int> mp; //如果是字符串到整型的映射,必须使用string而不能使用char数组
  4. map<string, vector<int> > mp; //map的键、值也可以是STL容器
  • map可以通过下标(mp['c']) 或 迭代器访问

  1. map<typename1, typename2>::iterator it;
  2. //it->first访问键 it->second访问值
  • map<char, int>::iterator it = mp.find('b'); 返回的是被查找元素的位置,没有则返回map.end()

  • mp.count('b') 返回的是被查找元素的个数,如果有,返回1(因为键唯一);否则返回0

  • .erase()

  • .size()

  • .clear()

5.queue

队列,先进先出的容器

  1. #include <queue>
  2. queue<typename> name;
  • .front()访问队首元素、.back()访问队尾元素

  • .push(x) 将x进行入队

  • .pop() 令队首元素出队

  • .empty() 检查queue是否为空

  • .size()

6.stack

栈,后进先出的容器

  1. #include <stack>
  2. stack<typename> name;
  • .push(x) 将x入栈

  • .top() 获得栈顶元素

  • .pop() 弹出栈顶元素

  • .empty()

  • .size()

7.priority_queue

优先队列,其底层是用堆(大顶堆)来实现的,队首元素一定是当前队列中优先级最高的那个

  1. #include <queue>
  2. priority_queue<typename> name;
  • 优先队列没有队列中的front()函数 与 back()函数,只能通过 .top() 函数访问队首元素

  • .push(x)

  • .pop()

  • .empty()

  • .size()

priority_queue优先级设置:

  1. priority_queue<int, vector<int>, less<int> > q;
  2. //第二个参数 vector<int>用来承载底层数据结构堆(heap)的容器,若第一个参数是double或char型,此处只需填写vector<double> 或 vector<char>
  3. //less<int> 表示数字越大的优先级越大
  4. //greater<int> 表示数字小的优先级大

常用函数或注意点

1.reverse函数

  1. //使用reverse将元素翻转
  2. #include <algorithm>
  3. vector<int> vec = {,,,,};
  4. reverse(vec.begin(),vec.end()); //将元素翻转,即逆序排列 5, 4, 3 ,2 ,1
  5. string str="C++REVERSE";
  6. reverse(str.begin(),str.end());//str结果为ESREVER++C

2.转义字符

  1. /*
  2. \n代表换行
  3. \0代表空字符NULL,其ASCII码为0,请注意\0不是空格

3.强制类型转换

  1. (类型名)变量名;

4.符号常量和const常量

  1. #define pi = 3.14 //注意末尾不加分号
  2. const double pi = 3.14;

5.小数建议使用double类型,以保证精确度

6.<cmath>头文件中常用的math函数

  1. #include <cmath>
  2. fabs(double x) //对double类型变量取绝对值
  3. floor(double x) //对double类型变量向下取整
  4. ceil(double x) //对double类型变量向上取整
  5. pow(double r, double p) //返回r的p次方
  6. sqrt(double x) //求算术平方根
  7. log(double x) //返回double变量的以自然对数为底的对数 ****************
  8. //C中没有任意底数求对数的函数, logab = logeb/logea
  9. sin(double x) cos(double x) tan(double x)
  10. asin(double x) acos(double x) atan(double x)
  11. round(double x) //将double变量四舍五入,返回类型也是double型,需进行取整

7.初始化 memset函数 和 fill函数

  1. bool isExist[maxn] = {false};
  2. memset(isExist, false, sizeof(isExist)); //memset函数在 <cstring>里
  3. //因为memset函数按照字节填充,所以一般memset只能用来填充char型数组,(因为只有char型占一个字节)如果填充int型数组,除了0和-1,其他的不能。因为只有00000000 = 0,-1同理,如果我们把每一位都填充“1”,会导致变成填充入“11111111”
  1. //推荐
  2. include <algorithm> //在 <algorithm>里面
  3. int arr[maxn];
  4. fill(arr, arr+maxn, 要填入的内容);

8.结构体(struct)内不能定义自己本身,但可以定义自身类型的指针变量

9.圆周率 π

  1. const double Pi = acos(-1.0);

10.string.h头文件

  1. strlen(字符数组) //得到字符数组第一个\0前得字符的个数
  2. strcmp(str1, str2) //比较 str1==str2,返回0;str1>str2,返回正数;str1<str2,返回负数
  3. strcpy(str1, str2) //复制
  4. strcat(str1, str2) //拼接

11.printf输出特殊符号和常用的输出形式

  1. //输出 % 或 \
  2. printf("%%");
  3. printf("\\");
  4. // %md 可以使不足m位的int型变量以m位进行右对齐输出,其中高位用空格补齐;如果变量本身超过m位,则保持原样
  5. // %0md 较上不同是变量不足m位时,0补位
  6. // %.mf 可以让浮点数保留m位小数输出

12.scanf

scanf的 %c 格式可以读入换行符和空格,因此需要在每行输入前把上一行的换行符接收,使用getchar()

除了 %c 外,scanf对其他格式符(如%d %s)的输入是以空格、换行等为结束判断标志的,

因此除非使用%c把空格字符读入,其他情况都会自动跳过空格。

13.cin 和 cout

  1. //以下两者常用于输入一行数据
  2. char str[]; //char数组
  3. cin.getline(str, );
  4. string str; //string容器
  5. getline(cin, str);

14.getchar() putchar() gets() puts()

getchar可以识别换行符,用getchar输入字符串最后勿忘加 '\0',否则输出会出现乱码

gets识别换行符\n作为输入结束

puts自带换行符

  1. c = getchar();
  2. putchar(c);
  3. //puts(s) == printf("%s\n", s);
  4. gets(s); //接收输入的整个字符串直到回车为止
  5. scanf("%s", &s);//如果输入了空格会认为输入字符串结束, 空格后的字符将作为下一个输入项处理

15.sscanf sprintf (不易想起)

  1. sscanf(str, "%d", &n) //把字符数组str中的内容以 %d 的格式写到 int n 中
  2. sprintf(str, "%d", n) //把 n以 %d 的格式写到 str 字符数组中去

16.long long 为64位 即2^64 ,两个int相乘最大数据范围可达 long long

17.小数的四舍五入

  1. printf("%.2lf", final);
  2. //C++的输出不提供四舍五入功能,若要四舍五入,上述为例:
  3. printf("%.2lf", final+0.005);

18.int To string

  1. string str = to_string(int val); //参数可为其他类型,如 long、float、double等

string To int 、double、long

  1. #include <stdlib.h>
  2. char *str = "12345.67";
  3. int n = atoi(str); //字符串转换为整数(atoi)、长整数(atol)
  4. double d = strtod(str,NULL); //字符串转换为浮点数,与atof()使用结果相同

string To char

  1. string str = "";
  2. char *p = str.c_str();
  3. int x = atoi(p);
  4. str = to_string(x);

19.大小写转换

  1. //C语言
  2. char c;
  3. toupper(c);//转大写
  4. tolower(c);//转小写
  5. //C++
  6. string str = "Asd";
  7. str[] += ; //A转小写
  8. str[] -= ; //s转大写

20.N不会被除自己以外的大于根号N的整数整除(减少运算复杂度)

21.起始输入的个数不确定的情况

  1. //输入情况如下:7 5 31 5 88 67 88 17 个数不确定
  2. //进行字符串转数字操作
  3. string str;
  4. getline(cin, str); //接收一行数据
  5. for(int i=; i<str.length(); i++){ //数据处理
  6. int j;
  7. for(j=i; j<str.length(); j++){
  8. if(str[j] == ' ') break;
  9. }
  10. int x = ;
  11. for(int k=i; k<j; k++){
  12. x = x * + str[k] - '';
  13. }
  14. temp[num] = x;
  15. num++;
  16. i = j;
  17. }
  1. //输入情况如下:7 5 31 5 88 67 88 17 个数不确定
  2. //进行字符串转数字操作
  3. string str;
  4. getline(cin, str); //接收一行数据
  5. for(int i=; i<str.length(); i++){ //数据处理
  6. int j;
  7. for(j=i; j<str.length(); j++){
  8. if(str[j] == ' ') break;
  9. }
  10. int x = ;
  11. for(int k=i; k<j; k++){
  12. x = x * + str[k] - '';
  13. }
  14. temp[num] = x;
  15. num++;
  16. i = j;
  17. }
  1. //输入情况如下:7 5 31 5 88 67 88 17 个数不确定
  2. //进行字符串转数字操作
  3. string str;
  4. getline(cin, str); //接收一行数据
  5. for(int i=; i<str.length(); i++){ //数据处理
  6. int j;
  7. for(j=i; j<str.length(); j++){
  8. if(str[j] == ' ') break;
  9. }
  10. int x = ;
  11. for(int k=i; k<j; k++){
  12. x = x * + str[k] - '';
  13. }
  14. temp[num] = x;
  15. num++;
  16. i = j;
  17. }

算法笔记(C++)的更多相关文章

  1. 学习Java 以及对几大基本排序算法(对算法笔记书的研究)的一些学习总结(Java对算法的实现持续更新中)

    Java排序一,冒泡排序! 刚刚开始学习Java,但是比较有兴趣研究算法.最近看了一本算法笔记,刚开始只是打算随便看看,但是发现这本书非常不错,尤其是对排序算法,以及哈希函数的一些解释,让我非常的感兴 ...

  2. 算法笔记--数位dp

    算法笔记 这个博客写的不错:http://blog.csdn.net/wust_zzwh/article/details/52100392 数位dp的精髓是不同情况下sta变量的设置. 模板: ]; ...

  3. 算法笔记--lca倍增算法

    算法笔记 模板: vector<int>g[N]; vector<int>edge[N]; ][N]; int deep[N]; int h[N]; void dfs(int ...

  4. 算法笔记--STL中的各种遍历及查找(待增)

    算法笔记 map: map<string,int> m; map<string,int>::iterator it;//auto it it = m.begin(); whil ...

  5. 算法笔记--priority_queue

    算法笔记 priority_queue<int>que;//默认大顶堆 或者写作:priority_queue<int,vector<int>,less<int&g ...

  6. 算法笔记--sg函数详解及其模板

    算法笔记 参考资料:https://wenku.baidu.com/view/25540742a8956bec0975e3a8.html sg函数大神详解:http://blog.csdn.net/l ...

  7. 算法笔记——C/C++语言基础篇(已完结)

    开始系统学习算法,希望自己能够坚持下去,期间会把常用到的算法写进此博客,便于以后复习,同时希望能够给初学者提供一定的帮助,手敲难免存在错误,欢迎评论指正,共同学习.博客也可能会引用别人写的代码,如有引 ...

  8. 算法笔记_067:蓝桥杯练习 算法训练 安慰奶牛(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续地编号为1到N.每一个牧场都是 ...

  9. 算法笔记(c++)--回文

    算法笔记(c++)--回文 #include<iostream> #include<algorithm> #include<vector> using namesp ...

  10. 算法笔记(c++)--完全背包问题

    算法笔记(c++)--完全背包和多重背包问题 完全背包 完全背包不同于01背包-完全背包里面的东西数量无限 假设现在有5种物品重量为5,4,3,2,1  价值为1,2,3,4,5  背包容量为10 # ...

随机推荐

  1. (转)JDK1.8新特性Lambda表达式

    https://www.cnblogs.com/franson-2016/p/5593080.html Predicate predicate接收一个变量,并返回一个boolean值,predicat ...

  2. hdwiki 参考资料改成可点击跳转的(默认不能点)

    (1)首先在view这个文件夹找到viewdoc.htm文件.(2)在viewdoc.htm源码中搜索“<dd> <span>[{eval echo ($i+1)}]”找到下面 ...

  3. MT【92】空间余弦定理解题

    评:学校常规课堂教学里很少讲到这个,有点可惜.

  4. 【BZOJ1293】[SCOI2009]生日礼物(单调队列)

    [BZOJ1293][SCOI2009]生日礼物(单调队列) 题面 BZOJ 洛谷 题解 离散之后随便拿单调队列维护一下就好了. #include<iostream> #include&l ...

  5. 论如何优雅的用bitset来求四维偏序

    四维偏序.. 就是给你一个四维集合.再给你一些询问,请你求出a[i].x1<=ask.x1&&a[i].x2<=ask.x2&&a[i].x3<=as ...

  6. XStream--java对象与xml形式文件相互转换

    1.pom.xml中添加依赖 <dependency> <groupId>com.thoughtworks.xstream</groupId> <artifa ...

  7. Libre 6006 「网络流 24 题」试题库 / Luogu 2763 试题库问题 (网络流,最大流)

    Libre 6006 「网络流 24 题」试题库 / Luogu 2763 试题库问题 (网络流,最大流) Description 问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同 ...

  8. C++并发编程之std::async(), std::future, std::promise, std::packaged_task

    c++11中增加了线程,使得我们可以非常方便的创建线程,它的基本用法是这样的: void f(int n); std::thread t(f, n + 1); t.join(); 但是线程毕竟是属于比 ...

  9. NO.4: 确定对象被使用前已被初始化

    1.为内置对象进行 "手工初始化",因为C++不保证初始化他们(内置类型在赋值与初始化销毁基本相同,最好还是进行初始化列表),在内置类型过多情况下,可选择private函数统一初始 ...

  10. python操作txt文件中数据教程[2]-python提取txt文件

    python操作txt文件中数据教程[2]-python提取txt文件中的行列元素 觉得有用的话,欢迎一起讨论相互学习~Follow Me 原始txt文件 程序实现后结果-将txt中元素提取并保存在c ...