未命名
iterator
类似指针,用于访问容器中的对象
需要#include<iterator>
用法
1 | //1) 正向迭代器,定义方法如下: |
不同迭代器
常用的迭代器按功能强弱分为输入、输出、正向、双向、随机访问五种,这里只介绍常用的三种。
正向迭代器。假设 p 是一个正向迭代器,则 p 支持以下操作:++p,p++,*p。此外,两个正向迭代器可以互相赋值,还可以用==和!=运算符进行比较。
双向迭代器。双向迭代器具有正向迭代器的全部功能。除此之外,若 p 是一个双向迭代器,则–p和p–都是有定义的。–p使得 p 朝和++p相反的方向移动。
随机访问迭代器。随机访问迭代器具有双向迭代器的全部功能。若 p 是一个随机访问迭代器,i 是一个整型变量或常量,则 p 还支持以下操作:
p+=i:使得 p 往后移动 i 个元素。
p-=i:使得 p 往前移动 i 个元素。
p+i:返回 p 后面第 i 个元素的迭代器。
p-i:返回 p 前面第 i 个元素的迭代器。
p[i]:返回 p 后面第 i 个元素的引用。
此外,两个随机访问迭代器 p1
、p2
还可以用 <
、>
、<=
、>=
运算符进行比较。p1<p2
的含义是:p1
经过若干次(至少一次)++
操作后,就会等于 p2
。其他比较方式的含义与此类似。
对于两个随机访问迭代器 p1
、p2
,表达式p2-p1
也是有定义的,其返回值是 p2
所指向元素和 p1 所指向元素的序号之差(也可以说是 p2 和 p1 之间的元素个数减一)。
1 |
|
表1:不同容器的迭代器的功能
容器 | 迭代器功能 |
---|---|
vector | 随机访问 |
deque | 随机访问 |
list | 双向 |
set / multiset | 双向 |
map / multimap | 双向 |
stack | 不支持迭代器 |
queue | 不支持迭代器 |
priority_queue | 不支持迭代器 |
资料
STL 容器
STL 容器
序列式容器(Sequence containers),此为可序群集,其中每个元素均有固定位置—取决于插入时机和地点,和元素值无关。如果你以追加方式对一个群集插入六个元素,它们的排列次序将和插入次序一致。STL提供了三个序列式容器:向量(vector)、双端队列(deque)、列表(list).
关联式容器(Associative containers),此为已序群集,元素位置取决于特定的排序准则以及元素值,和插入次序无关。如果你将六个元素置入这样的群集中,它们的位置取决于元素值,和插入次序无关。STL提供了四个关联式容器:集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap)。
vector
可以看做可扩展的数组,末端可扩展,且末端插入快
需要include<vector>
deque
可以看做可双向扩展的vector
需要#include<queue>
list
双向链表,在内存中不连续存储。所以插入删除快,但不支持随机访问。
需要#include<list>
set
用红黑树实现,自动排序,元素不重复。
需要#include<set>
,multiset
也是
multiset
可以有重复元素
map
用红黑树实现,自动排序,元素不重复。
需要#inlcude<map>
,multimap
也是
multimap
可以有重复元素
用法
都能用迭代器遍历
各个容器用法差不多,下面以vector
为例
1 | //创建 |
map
,set
的插入用insert
1 | // 第一种 用insert函數插入pair |
list
,queue
支持头部插入,用push_front()
可以使用sort()
进行排序
merge()
将两个容器合并,合并成功后会按从小到大的顺序排列;
如:lt1.merge(lt2);
lt1容器中的元素全都合并到容器lt2中。
splice()
函数也是合并,可以指定合并位置,但是不自动排序
资料
https://www.w3cschool.cn/cpp/cpp-i6da2pq0.html
https://www.cnblogs.com/linuxAndMcu/p/10254542.html
https://blog.csdn.net/sevenjoin/article/details/81943864
https://blog.csdn.net/weixin_41588502/article/details/87978490
iomanip
iomanip
设置输出格式
include<iomanip>
1 | cout<<setprecision(9)<<a; //保留9位有效数字(默认为6) |
资料
C++基本
C++基本
语句尾加;
一行可以写多个语句
一个语句也可以占几行
注释
1 | // 单行注释 |
C++ 关键字
https://www.runoob.com/w3cnote/cpp-keyword-intro.html
运算符 表达式
https://www.runoob.com/w3cnote/cpp-keyword-intro.html
=
赋值运算符 自右向左
赋值表达式返回指向目标的引用
->
1 | a=b=c=d=100; |
合法,先把100赋值给d,之后把d的值赋给c…
输入输出
cin cout
在<iostream>
中
空格和回车会分隔输入
输入char会截取第一个字符(不包括空格),后面的继续传递
cin
,cout
没有返回值,while(cin>>a)
中的返回值是>>
操作符返回istream&类型
getchar putchar
在<cstdio>
中
源自c语言
输入输出单个字符
回车也是字符
putchar <string>
会出错
分支
if
1 | if(boolean_expression){ |
switch
1 | switch(expression){ |
eg.
1 | switch(a){ |
循环
1 | break;//跳出当前循环 |
for
1 | for ( init; condition; increment ) |
eg.
1 | for (int i=1;i<5; i++) //只要有两个分号分出三段就可以,分号之间不写也可以 |
while
1 | while(condition) |
资料来源
https://www.runoob.com/cplusplus/cpp-switch.html
https://www.runoob.com/cplusplus/cpp-if-else.html
https://blog.csdn.net/jackbai1990/article/details/7467030
https://www.jianshu.com/p/0d3777c8147b
https://www.runoob.com/cplusplus/cpp-do-while-loop.html
一些计算机相关网站
YAML 基本语法
YAML 基本语法
基本
大小写敏感
用#注释
用a: b
代表一对键值对
注意:冒号之后有一个空格
用空格代表层级,如:
1 | a: |
空格相同的就是同一层级
空格数不限,但是同一级空格数必须相同
理论上不允许用tab缩进
行内写法:
1 | a: {b: c,d: e} |
不能有两个相同的key
值写法
字符串不用加双引号、单引号
双引号表示不转义其中的字符,单引号反之
数组
1 | a: |
行内写法:
1 | a: [b,c] |
其他
强制类型转换
a: !!str b
将b
强制转换成字符串
指针
1 | father: &father1 |
开头结尾
1 | 开头 |
参考
Markdown速查
Markdown速查
可加HTML
一般行之间需加空行,要不然会连在一起
例子
1 | 1. |
4.
行内语句
5.
引用 //引用可嵌套,或者说多重引用
然
//这里不要空行,空行会隔开并
//同理,这里也不需要卵
直接这样也可
6.
— //分割线,上下不需空行
7.
| j\i | 1 | 2 | …… | c |
| — | — | — | — | — |//第二行必须这样|-|-|并且格数与第一行相同
| 1(底) |||||
| 2 | ||||
| …… |||||
| n(顶) ||||最终解|
8.
9.
斜体
10.
粗体 //粗斜体,符号间不加空格
11.
删除线
12.
//
//图片alt就是显示在图片下面的文字,相当于对图片内容的解释。
//图片title是图片的标题,当鼠标移到图片上时显示的内容。title可加可不加
13.
//列表:
//用 - + * 任何一种都可以
//有序列表数字加”.”
//上级与下级之间加三个空格或tab
//不用空行
- What
- the
- f
- u
- c
- k?
- the
14.
选择框 //里面和前面要有空格,后面要有空格加字
(选中)选择框 //同上,里面的空格换成”x”
15.
//表情详见https://github.com/guodongxiaren/README/blob/master/emoji.md
//eg.
:blush:
16.
++下划线++ //有些编译器(包括GitHub)不支持
17.
==高亮== //同上
18.
//待解释文字[^脚注 id]
//[^脚注 id]:注释内容
//eg.
踩^1 //GitHub脚注只能写数字
1 |
|
效果
1.
一级标题见开头
二级标题
三级标题
超链接:文字
3.
1 | 代码块 |
4.
行内语句
5.
引用
然
并
卵
直接这样也可
6.
7.
j\i | 1 | 2 | …… | c |
---|---|---|---|---|
1(底) | ||||
2 | ||||
…… | ||||
n(顶) | 最终解 |
8.
9.
斜体
10.
粗体
11.
删除线
12.
13.
- What
- the
- f
- u
- c
- k?
- the
14.
选择框
(选中)选择框
15.
:blush:
16.
++下划线++
17.
==高亮==
18.
踩 ^1
下标
上标
空格
C++位运算
位运算
用位运算代替普通运算可以加快运算速度
位运算基础
>>n
右移n位,舍去末n位
>>=n
右移n位并赋值
<<n
左移n位,末尾添0
<<=n
左移n位并赋值,相当于乘以2^na<<=1
等价于a*=2
&
按位与
^
按位异或,异或运算真值表如下
A | B | res |
---|---|---|
1 | 1 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
|
按位或
~
按位取反(只有这个是一元运算符)
加减
a+b=a^b+(a&b)<<1
a^b
等价于不考虑进位时的a+b
(a&b)<<1
进位操作,两个数此位都是1时才进位,按位与也一样(都为一才为一)。再把结果左移一位,完成进位
减法把减数按位取反之后同加法。
计算一个数(B)中有多少1
1 | while (x) |
运行完后count
的值就是1的个数。
如果count
为0,则x
为2的整数指数幂。
Sort()函数
Sort()
函数
sort()
为标准库自带排序函数,非常常用。可以让人省去很多时候写排序算法的麻烦。作为快排速度也很快,能满足大多数情况下的使用。
sort()
能对数组、结构体、类等多种元素进行排序。
基本
形参表
sort(beg,end,[cmp])
其中beg
和end
分别是起始元素和结束元素的地址,cmp是排序方式
1 | //eg.给数组排序 |
cmp
缺省升序排列(从小到大)。
如果要降序排列,需要写个cmp函数,如下:
1 | bool compare1(int a,int b) |
标准库中也有此类函数,在<functional>
中,包括equal_to<Type>
、not_equal_to<Type>
、greater<Type>
、greater_equal<Type>
、less<Type>
、less_equal<Type>
等,上面写的compare1
函数相当于greater<int>
。
字符串
例子说明一切
1 | string hhh("jojo"); |
结果:“jjoo”
结构体
1 | #include<iostream> |