2022/3/31
这里需要有C语言的基础喔~
主要用C++来搞算法的,末尾附思维导图及教程
头文件前面统一省略了#include
1、using namespace std;
命名空间,通过命名空间来区分不同的包。
2、string类
C++的字符串类型。
头文件
<cstring>
定义string:
string s1 = "asdk";
获取长度:
s1.length()或s1.size();
拼接:
string s2 = "xx"; string s3 = s1 + s2;则s3="asdkxx";
复制字符串:
string s4 = s1.substr(0,3)//即将s1中下标0--3的字符复制给s4;
string s4 = s1.substr(2,2)//即将s1下标2开始的后面两个字符复制给s4;
string s4 = s1.substr(2);//即将s1下标2之后的所有字符复制给s4
(从这开始就是STL容器了,所有容器获取大小的方法都是x.size())
3、vector
C++的数组或者说向量
头文件:
<vector>
定义:
vector<int>v;
重新设置大小:
v.resize(10);//将v的大小重新设置为10
末尾添加新元素:
v.push_back(1);
v.emplace_back(1);//效率比前者高
设置一个数组并赋予初值:
vector<int>v(10,2);//大小为10,并初值全部为2
头尾节点:
v.begin();
v.end();
迭代器遍历:
for(auto p = v.begin();p<v.end;p++){
cout<<*p<<" ";
}
这里p可以看成是指针,即访问数组中对应下标的元素
4、set
集合类
头文件:
<set>
定义:
set<int>s;//后面不能带任何参数,因为集合中元素不能重复,且不能为空
插入:
s.insert(1);
迭代器:
for(auto p = s.begin();p!=s.end();p++){
cout<<*p<<" ";
}
//这里的s.end()是在最后一个元素的下一个位置
寻找元素:
s.find(2);//从0开始找这个元素,若没有找到则返回s.end();找到了返回下标索引
删除元素:
s.erase(1);//删除集合中的1,没有则不做处理
另:set会自动将元素从小到大排列
5、map
键值对
头文件
<map>
定义:
map<string,int>m;//即键是string类,值时int类
例如:m("hello") = 2;m("world") = 3;
遍历:
for(auto p = m.begin();p!=m.end();p++){
cout<<p->first<<":"<<p->second<<endl;
}
这里的p->first即对应的是键;second即键对应的值
另map是根据键来升序排序存储的。
6、stack
栈
头文件:
<stack>
定义:
stack<int>a;
压入栈:
a.push(1);
出栈:
a.pop();
获取头节点:
a.top();
7、queue
队列
头文件:
<queue>
定义:
queue<int>s;
入队:
s.push(1);
出队:
s.pop();
队首和队尾:
s.front();
s.back();
8、unordered_map和unordered_set
无序的键值对、集合(哈希表)
头文件:
<unordered_map>
<unordered_set>
这些的应用和之前的一样,不同的是是无序了?
9、bitset
字符数组
头文件:
<bitset>
定义:
bitset<5>b(19); //将b用五位二进制表示,初值为19 即10011
string m = "010101011";
bitset<5>b(m,0,5);//将m中下标从0开始的后五位赋值给b。
另外存储时是低位到高位存储的。即用for循环输出时是相反的。
查看是否有1:
b.any()//有返回1,没有返回0
是否没有1:
b.none();//没有返回1,有返回0
1的个数:
b.count();
元素个数
b.size();
下标为i的元素是不是1:
b.test(i);
所有取反与归零:
b.filp();//取反
b.reset();//归零
将第i位取反与归零:
b.filp(i);
b.reset(i);
将其转化为十进制数:
unsigned long a = b.to_ulong();
10、sort
排序
头文件:
<algorithm>//是算法的意思
使用:
vector<int>m(10);
for(int i=9;i>=0;i--){
m[i] = i;
}
sort(m.begin(),m.end());
自定义排序规则:
降序排序:
bool cmp(int x,int y){
return x>y;
}
使用:
sort(m.begin(),m.end(),cmp);
结构体排序:
struct person{
string name;
int age;
}
bool cmp(person a,person b){
if(a.age != b.age) //若年龄不相等则按年龄升序排序
return a.age<b.age;
else //若年龄相等,则按名字升序排序
rerturn a.name<b.name;
}
使用:
sort(m.begin(),m.end(),cmp);
11、ctype
操作字符
头文件:
<cctype>
功能函数:
char ch = 'A';
判断是不是字母:
isalpha(ch);
判断是不是小写字母:
islower(ch);
判断是不是大写字母:
issupper(ch);
判断是不是字母或者数字:
isalnum(ch);
判断是不是空格或者其它符号:
isspace(ch);
将字母转化为小写字母:
tolower(ch);
将字母转化为大写字母:
toupper(ch);
12、auto声明
能直接判断是什么类型:
auto x = 19;
auto y = 1.88;
auto使用必须要初始化,即根据初始化的值来判断数据类型的。
迭代器 (栈和队列不能用迭代器):
vector<int>a(10,1);
for(auto p = a.begin();p<a.end();p++){
cout<<*p<<endl;
}
13、基于范围的for循环
使用这个并不能改变数组中的值,只是临时改变
测试:
int a[5] = {1};
for(int i:a){
i++;
}
for(int i:a){
cout<<i<<" ";
}
改变值要用地址:
int a[5] = {1};
for(int &i:a){
i++;
}
for(int i:a){
cout<<i<<" ";
}
14、to_string与stoi、stod
头文件:
<string>
to_string:
将数字转化为字符
string s = to_string(123.091231);
stoi:
将字符转化为整型
int a = stoi("123");
stod:
将字符转化为浮点型
double b = stod("12.34");
15、Dev c++ 设置c++11
15.1:点击Settings->Compiler
15.2:将c++11勾上然后ok!
中文版:
点击工具->编译选项->代码生成优化->
代码生成->最后一行语言标准那里下拉选择ISO C++11
16、获取思维导图
提取码:ksow
17、教程直达链接
此教程来自戴至湘大佬,收获许多,在此感谢Thanks♪(・ω・)ノ
教程