0%

函数

声明/定义

基本

重载

形参有默认值

资料

iterator

类似指针,用于访问容器中的对象

需要#include<iterator>

用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//1) 正向迭代器,定义方法如下:
//容器类名::iterator 迭代器名;
vector<int>::iterator i;

//2) 常量正向迭代器,定义方法如下:
//容器类名::const_iterator 迭代器名;

//3) 反向迭代器,定义方法如下:
//容器类名::reverse_iterator 迭代器名;

vector<int>::reverse_iterator ri;

//4) 常量反向迭代器,定义方法如下:
//容器类名::const_reverse_iterator 迭代器名;



// 迭代器都可以进行++操作。反向迭代器和正向迭代器的区别在于:
// 对正向迭代器进行++操作时,迭代器会指向容器中的后一个元素;
// 而对反向迭代器进行++操作时,迭代器会指向容器中的前一个元素。

for (i = v.begin(); i != v.end(); ++i) { //用迭代器遍历容器
cout << *i << " "; //*i 就是迭代器i指向的元素
*i *= 2; //每个元素变为原来的2倍
}

//begin 成员函数返回指向容器中第一个元素的迭代器。++i 使得 i 指向容器中的下一个元素。end 成员函数返回的不是指向最后一个元素的迭代器,而是指向最后一个元素后面的位置的迭代器,因此循环的终止条件是i != v.end()。

不同迭代器

常用的迭代器按功能强弱分为输入、输出、正向、双向、随机访问五种,这里只介绍常用的三种。

  1. 正向迭代器。假设 p 是一个正向迭代器,则 p 支持以下操作:++p,p++,*p。此外,两个正向迭代器可以互相赋值,还可以用==和!=运算符进行比较。

  2. 双向迭代器。双向迭代器具有正向迭代器的全部功能。除此之外,若 p 是一个双向迭代器,则–p和p–都是有定义的。–p使得 p 朝和++p相反的方向移动。

  3. 随机访问迭代器。随机访问迭代器具有双向迭代器的全部功能。若 p 是一个随机访问迭代器,i 是一个整型变量或常量,则 p 还支持以下操作:
    p+=i:使得 p 往后移动 i 个元素。
    p-=i:使得 p 往前移动 i 个元素。
    p+i:返回 p 后面第 i 个元素的迭代器。
    p-i:返回 p 前面第 i 个元素的迭代器。
    p[i]:返回 p 后面第 i 个元素的引用。

此外,两个随机访问迭代器 p1p2 还可以用 <><=>= 运算符进行比较。p1<p2的含义是:p1 经过若干次(至少一次)++操作后,就会等于 p2。其他比较方式的含义与此类似。

对于两个随机访问迭代器 p1p2,表达式p2-p1也是有定义的,其返回值是 p2 所指向元素和 p1 所指向元素的序号之差(也可以说是 p2 和 p1 之间的元素个数减一)。

1
2
3
4
5
6

i = v.begin();
while(i < v.end()) { //间隔一个输出
cout << * i;
i += 2; // 随机访问迭代器支持 "+= 整数" 的操作
}

表1:不同容器的迭代器的功能

容器 迭代器功能
vector 随机访问
deque 随机访问
list 双向
set / multiset 双向
map / multimap 双向
stack 不支持迭代器
queue 不支持迭代器
priority_queue 不支持迭代器

资料

http://c.biancheng.net/view/338.html

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//创建
vector<T> v1; //创建类型为T的对象。默认构造函数 v1 为空。
vector<T> v2(v1); //v2 是 v1 的一个副本。
vector<T> v3(n, i); //v3 包含 n 个值为 i 的元素。
vector<T> v4(n); //v4 含有值初始化的元素的 n 个副本。

//大小
vec.size();

//访问元素
cout<<vec[0]<<endl;//用下标
//遍历一般用迭代器,参考迭代器那篇

//插入
vec.insert(vec.begin()+i,a); //在第i+1个元素前面插入a;
//尾部插入
vec.push_back(a);

//删除
vec.erase(vec.begin()+2); //删除第3个元素
vec.erase(vec.begin()+i,vec.end()+j); //删除区间[ i,j-1] 区间从0开始

//清空
vec.clear();

map,set的插入用insert

1
2
3
4
5
// 第一种 用insert函數插入pair
mapStudent.insert(pair<int, string>(000, "student_zero"));

// 第二种 用insert函数插入value_type数据
mapStudent.insert(map<int, string>::value_type(001, "student_one"));

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

设置输出格式

include<iomanip>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
cout<<setprecision(9)<<a; //保留9位有效数字(默认为6)
cout<<setiosflags(ios::fixed)<<a;//设置格式标志为小数(默认也是6,即保留6位小数)
cout<<setiosflags(ios::fixed)<<setprecision(9)<<a;//保留9位小数

cout<<setiosflags(ios::showbase); //显示进制的前缀

cout<<hex<<a;
cout<<setiosflags(ios::apperence)<<a;
cout<<setw(10)<<b<<","<<b;//设置宽度为10
cout<<setfill("*")<<setw(10)<<b<<","<<b;//不用空格而用"*"填充不足的宽度
cout<<setiosflags(ios::positive)<<b;//打出正号

cout << "oct: " << showbase << setbase(8) << a << " " << oct << a << endl;
cout << "dec: " << showbase << setbase(10) << a << " " << dec << a << endl;
cout << "hex: " << showbase << setbase(16) << a << " " << hex << a << endl;

// oct:八进制,dec:十进制,hex:十六进制,上面两种写法效果一样

cout << fixed <<setprecision(12) << pi << endl;
cout<<setiosflags(ios::left); //输出左对齐
cout<<setiosflags(ios::right); //输出右对齐 默认右对齐

//除setw()外都是全局有效,setw()只对紧跟的一个有效

资料

https://www.cnblogs.com/lsgxeva/p/7696410.html

C++基本

语句尾加;

一行可以写多个语句

一个语句也可以占几行

注释

1
2
3
4
5
6
7
8
9
10
11
12
13
// 单行注释

/*
块注释,不可嵌套
*/

/*
*一般写成这样
*
*
*/

/*块注释也可以写在一行里*/

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会截取第一个字符(不包括空格),后面的继续传递

cincout没有返回值,while(cin>>a)中的返回值是>>操作符返回istream&类型

getchar putchar

<cstdio>

源自c语言

输入输出单个字符

回车也是字符

putchar <string>会出错

分支

if

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
if(boolean_expression){
statement(s);
}

if(boolean_expression)
{
// 如果布尔表达式为真将执行的语句
}
else
{
// 如果布尔表达式为假将执行的语句
}


//写成一行
if(boolean_expression)statement;

if(boolean_expression){statements;}

if()
{

}
else if //else if
{

}
else
{

}

switch

1
2
3
4
5
6
7
8
9
10
11
12
switch(expression){
case constant-expression :
statement(s);
break; //跳出循环,看情况写
case constant-expression :
statement(s);
break;

// 可以有任意数量的 case 语句
default :
statement(s);
}

eg.

1
2
3
4
5
6
7
8
9
switch(a){
case 1:
cout<<x<<endl;
case 2:
x++;
break;
default:
cout<<"error"<<endl;
}

循环

1
2
3
break;//跳出当前循环

continue;//跳出本次循环进入下一次循环

for

1
2
3
4
for ( init; condition; increment )
{
statement(s);
}

eg.

1
2
3
4
5
6
7
8
9
for (int i=1;i<5; i++) //只要有两个分号分出三段就可以,分号之间不写也可以
{
cout<<i;
}

for(;;)//死循环
{

}

while

1
2
3
4
5
6
7
8
9
while(condition)
{
statement(s);
}

do
{
statement(s);
}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

https://www.runoob.com/cplusplus/cpp-for-loop.html

https://www.runoob.com/cplusplus/cpp-while-loop.html

一些计算机相关网站

问答网站

思否

Stack Overflow

教学

PTA

Codecademy

菜鸟教程

OI Wiki

fenby

蓝桥杯

0xffff

Learning x in y Minutes

w3school

微软教学资源

论坛、博客

CSDN

阿里云

博客园

资料、资源

Github

码云

站长之家

芋道源码

OpenSourse

Gitlab

Google Code

SourceForge

官方文档

boost

python

NexT

Github

GIMP

Anaconda

Hexo

c++/c

Microsoft

OJ/题库

洛谷

LeetCode

GitHub学习资源

大学

北京大学

广东工业大学

浙江大学

清华大学

上海交通大学

郑州大学

南京大学

东南大学

山东科技大学

北京林业大学

中山大学

其他

小浩算法

Bilibili公开课目录

戴铭学习记录

TeachYourselfCS中文版

技术面试必备知识

计算机专业课思维导图

学习资料

OSSU

开源协议

MIT

GPL

Apache

CC

Choose a License

YAML 基本语法

基本

大小写敏感

用#注释

a: b代表一对键值对

注意:冒号之后有一个空格

用空格代表层级,如:

1
2
3
4
5
6
a:
b: c
d: e
f:
g: h
i: j

空格相同的就是同一层级

空格数不限,但是同一级空格数必须相同

理论上不允许用tab缩进

行内写法:

1
a: {b: c,d: e}

不能有两个相同的key

值写法

字符串不用加双引号、单引号

双引号表示不转义其中的字符,单引号反之

数组

1
2
3
a:
- b
- c

行内写法:

1
a: [b,c]

其他

强制类型转换

a: !!str bb强制转换成字符串

指针

1
2
3
father: &father1
name: a
monitor: *father

开头结尾

1
2
3
4
5
开头
---

...
结尾

参考

  1. 【教程】十分钟让你了解yaml - 轩脉刃de刀光剑影

  2. YAML配置文件的写法

  3. YAML-维基百科

  4. yaml.org

Markdown速查

可加HTML

一般行之间需加空行,要不然会连在一起

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1.

# 一级标题 //#和文字间要有空格

## 二级标题

### 三级标题

... //后面+空格加标题,n个#n级,最多6级

2.

//超链接

[文字](url)

3.
```语言//Markdown对语言名的支持很强大,比如c++既可以写成cpp又可以写成c++,且大小写不敏感
//此处不用空行
代码块
//此处也不用空行

4.

行内语句

5.

引用 //引用可嵌套,或者说多重引用


//这里不要空行,空行会隔开


//同理,这里也不需要

直接这样也可

6.

— //分割线,上下不需空行

7.

| j\i | 1 | 2 | …… | c |
| — | — | — | — | — |//第二行必须这样|-|-|并且格数与第一行相同
| 1(底) |||||
| 2 | ||||
| …… |||||
| n(顶) ||||最终解|

8.

9.

斜体

10.

粗体 //粗斜体,符号间不加空格

11.

删除线

12.

//![图片alt](图片地址 ‘’图片title’’)
//图片alt就是显示在图片下面的文字,相当于对图片内容的解释。
//图片title是图片的标题,当鼠标移到图片上时显示的内容。title可加可不加

blockchain

13.

//列表:
//用 - + * 任何一种都可以
//有序列表数字加”.”
//上级与下级之间加三个空格或tab
//不用空行

  • What
    • the
      • f
      • u
      • c
      • k?

14.

  • 选择框 //里面和前面要有空格,后面要有空格加字

  • (选中)选择框 //同上,里面的空格换成”x”

15.

//表情详见https://github.com/guodongxiaren/README/blob/master/emoji.md
//eg.

:blush:

16.

++下划线++ //有些编译器(包括GitHub)不支持

17.

==高亮== //同上

18.

//待解释文字[^脚注 id]
//[^脚注 id]:注释内容
//eg.

^1 //GitHub脚注只能写数字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

## HTML标识

```html
<sub>下标</sub>

<sup>上标</sup>

<center>居中</center>

&nbsp;空格

<img src="https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3535676397,3118512885&fm=26&gp=0.jpghttps://github.com/yeszao/dnmp" width=256 height=256 />//用HTML的方法加图片,可以设置大小。

<img src="https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3535676397,3118512885&fm=26&gp=0.jpghttps://github.com/yeszao/dnmp" width=50% height=50% />width和height后面的50%就是根据窗口的大小以一定的比例显示图片。值得一说的是,这种按照百分比显示方法,是以width方向为准,并保持纵横比的,换句话说,把设置width的部分去掉,height的值改为任意百分比,显示的图像都是原图大小。因此用此方法的时候,可以把height设置缺省。

<img src="https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3535676397,3118512885&fm=26&gp=0.jpghttps://github.com/yeszao/dnmp" width=50% />//height缺省

//其他标识见html博客



效果

1.

一级标题见开头

二级标题

三级标题

超链接:文字

3.

1
代码块

4.

行内语句

5.

引用

直接这样也可

6.


7.

j\i 1 2 …… c
1(底)
2
……
n(顶) 最终解

8.

9.

斜体

10.

粗体

11.

删除线

12.

blockchain

13.

  • What
    • the
      • f
      • u
      • c
      • k?

14.

  • 选择框

  • (选中)选择框

15.

:blush:

16.

++下划线++

17.

==高亮==

18.

^1


下标

上标

居中

 空格

位运算

用位运算代替普通运算可以加快运算速度

位运算基础

>>n 右移n位,舍去末n位

  • >>=n 右移n位并赋值

<<n 左移n位,末尾添0

  • <<=n 左移n位并赋值,相当于乘以2^n
    • a<<=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
2
3
4
5
while (x)
{
count++;
x = x&(x - 1); //消去x中最后一位1
}

运行完后count的值就是1的个数。

如果count为0,则x为2的整数指数幂。

Sort()函数

sort()为标准库自带排序函数,非常常用。可以让人省去很多时候写排序算法的麻烦。作为快排速度也很快,能满足大多数情况下的使用。

sort()能对数组、结构体、类等多种元素进行排序。

基本

形参表

sort(beg,end,[cmp])

其中begend分别是起始元素和结束元素的地址,cmp是排序方式

1
2
3
4
5
//eg.给数组排序
int a[10]={0};
for(int i=0;i<10;i++)
cin>>a[i];
sort(a,a+10,compare); //a是数组头地址,a+10是a[9]的地址

cmp缺省升序排列(从小到大)。

如果要降序排列,需要写个cmp函数,如下:

1
2
3
4
bool compare1(int a,int b)
{
return a>b; //cmp为true时不交换
}

标准库中也有此类函数,在<functional>中,包括equal_to<Type>not_equal_to<Type>greater<Type>greater_equal<Type>less<Type>less_equal<Type>等,上面写的compare1函数相当于greater<int>

字符串

例子说明一切

1
2
string hhh("jojo");
sort(hhh.begin(),hhh.end());//用迭代器,begin()表示起始地址,end()表示结束地址

结果:“jjoo”

结构体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<iostream>
#include<algorithm>
using namespace std;

struct link
{
int a,b;
};

bool cmp(link x,link y) //先比a,a一样再比b
{
if(x.a==y.a)
return x.b>y.b;
return x.a>y.a;
}

int main()
{
link x[4];
for(int i=0;i<4;i++)
cin>>x[i].a>>x[i].b;
sort(x,x+4,cmp);
for(int i=0;i<4;i++)
cout<<x[i].a<<' '<<x[i].b<<endl;
return 0;
}