一、基础篇

C++标准模板库(STL)

1.vector

可以理解为“变长数组”

#include <vector>
vector<typename> name;
vector<vector<int> > name; //两个维都可变长的二维数组 >>之间要加空格
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]

  • 通过迭代器访问

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

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

2.set

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

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

  • .size()

  • .clear()

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

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

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

3.string

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

  • operator+=

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

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

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

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

str.insert(pos, str2); //在pos号位置插入字符串str2,str2处直接"..."也行
string str = "abcxyz", str2 = "opq";
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会以键从小到大的顺序自动排序

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

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

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

  • .erase()

  • .size()

  • .clear()

5.queue

队列,先进先出的容器

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

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

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

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

  • .size()

6.stack

栈,后进先出的容器

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

  • .top() 获得栈顶元素

  • .pop() 弹出栈顶元素

  • .empty()

  • .size()

7.priority_queue

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

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

  • .push(x)

  • .pop()

  • .empty()

  • .size()

priority_queue优先级设置:

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

常用函数或注意点

1.reverse函数

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

2.转义字符

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

3.强制类型转换

(类型名)变量名;

4.符号常量和const常量

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

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

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

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

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

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

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

9.圆周率 π

const double Pi = acos(-1.0);

10.string.h头文件

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

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

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

12.scanf

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

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

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

13.cin 和 cout

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

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

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

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

puts自带换行符

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

15.sscanf sprintf (不易想起)

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

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

17.小数的四舍五入

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

18.int To string

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

string To int 、double、long

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

string To char

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

19.大小写转换

//C语言
char c;
toupper(c);//转大写
tolower(c);//转小写
//C++
string str = "Asd";
str[] += ; //A转小写
str[] -= ; //s转大写

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

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

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

算法笔记(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. 页面用一个遮罩层显示加载,加载完后隐藏该div

    <div id="background" class="background" style="display: none; "> ...

  2. FortiGate 硬件加速

    FortiGate 硬件加速 来源 https://wenku.baidu.com/view/07749195a1c7aa00b52acb63.html 硬件加速 来源 https://blog.cs ...

  3. 自学Zabbix3.10.1.5-事件通知Notifications upon events-媒介类型Script

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix3.10.1.5-事件通知Notifications upon events-媒介 ...

  4. BZOJ2738 矩阵乘法 【整体二分 + BIT】

    题目链接 BZOJ2738 题解 将矩阵中的位置取出来按权值排序 直接整体二分 + 二维BIT即可 #include<algorithm> #include<iostream> ...

  5. 洛谷 P1073 最优贸易 解题报告

    P1073 最优贸易 题目描述 \(C\)国有\(n\)个大城市和\(m\)条道路,每条道路连接这\(n\)个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这\(m\)条道路中有一部分 ...

  6. 文件操作,内置函数open()

    先看看官方说明: The default mode is 'r' (open for reading text, synonym of 'rt'). For binary read-write acc ...

  7. java字符数组char[]和字符串String之间的转换

    java字符数组char[]和字符串String之间的转换 觉得有用的话,欢迎一起讨论相互学习~Follow Me 使用String.valueOf()将字符数组转换成字符串 void (){ cha ...

  8. SQL记录-PLSQL游标

    PL/SQL游标 Oracle会创建一个存储区域,被称为上下文区域,用于处理SQL语句,其中包含需要处理的语句,例如所有的信息,行数处理,等等. 游标是指向这一上下文的区域. PL/SQL通过控制光标 ...

  9. LVS原理详解(3种工作模式及8种调度算法)

    2017年1月12日, 星期四 LVS原理详解(3种工作模式及8种调度算法)   LVS原理详解及部署之二:LVS原理详解(3种工作方式8种调度算法) 作者:woshiliwentong  发布日期: ...

  10. 8个提高效率的CSS实用工具

    CSS,也就是Cascading Style Sheets,推出于1997年,差不多是17年前,至此为我们开发网页大开方便之门,协助我们制作出一个又一个惊艳绝伦的网站设计和模板,提升了我们的创造能力, ...