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