C++标准模板库(STL)
1.vector
可以理解为“变长数组”
#include <vector> vector<typename> name; vector<vector<int> > name; //两个维都可变长的二维数组 >>之间要加空格 vector<typename> Arrayname[arraySize]; //Arrayname[0]~Arrayname[arraySize-1]中每一个都是一个vector容器
-
-
.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()是尾元素地址的下一个地址
vi.erase(it); //删除迭代器为it处的元素 vi.erase(a, b); //删除[a,b)内所有元素
集合,是一个内部自动有序且不含重复元素的容器
#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()){//怎么判断查找到 } }
-
-
.size()
-
.clear()
-
.insert(x)将x插入set容器中,并自动递增排序和去重
-
.find(value) 返回set中对应值为value的迭代器
-
.erase():删除单个元素、删除一个区间内的所有元素
#include <string> string str; string str = "abcd"; //如果要读入和输出整个字符串,则只能用 cin 和 cout
-
-
operator+=
str3 = str1 + str2;
str1 += str2;
-
==、!=、<、<=、>、>=
-
string str = "abcxyz"; printf("%d %d\n", str.length(), str.size()); //输出 6 6
str.insert(pos, str2); //在pos号位置插入字符串str2,str2处直接"..."也行 string str = "abcxyz", str2 = "opq"; str.insert(str.begin()+3, str2.begin(), str2.end());//在str的3号位(即c和x之间)插入str2
-
-
.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访问值
-
-
mp.count(‘b‘) 返回的是被查找元素的个数,如果有,返回1(因为键唯一);否则返回0
-
.erase()
-
.size()
-
.clear()
5.queue
队列,先进先出的容器
#include <queue>
queue<typename> name;
-
-
.push(x) 将x进行入队
-
.pop() 令队首元素出队
-
.empty() 检查queue是否为空
-
.size()
6.stack
栈,后进先出的容器
#include <stack>
stack<typename> name;
-
-
.top() 获得栈顶元素
-
.pop() 弹出栈顶元素
-
.empty()
-
.size()
7.priority_queue
优先队列,其底层是用堆(大顶堆)来实现的,队首元素一定是当前队列中优先级最高的那个
#include <queue>
priority_queue<typename> name;
-
-
.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> 表示数字小的优先级大
//使用reverse将元素翻转 #include <algorithm> vector<int> vec = {1,2,3,4,5}; 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;
#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, 要填入的内容);
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位小数输出
scanf的 %c 格式可以读入换行符和空格,因此需要在每行输入前把上一行的换行符接收,使用getchar()
除了 %c 外,scanf对其他格式符(如%d %s)的输入是以空格、换行等为结束判断标志的,
因此除非使用%c把空格字符读入,其他情况都会自动跳过空格。
//以下两者常用于输入一行数据 char str[100]; //char数组 cin.getline(str, 100); string str; //string容器 getline(cin, str);
? getchar可以识别换行符,用getchar输入字符串最后勿忘加 ‘\0‘,否则输出会出现乱码
? gets识别换行符\n作为输入结束
?
c = getchar(); putchar(c); //puts(s) == printf("%s\n", s); gets(s); //接收输入的整个字符串直到回车为止 scanf("%s", &s);//如果输入了空格会认为输入字符串结束, 空格后的字符将作为下一个输入项处理
sscanf(str, "%d", &n) //把字符数组str中的内容以 %d 的格式写到 int n 中 sprintf(str, "%d", n) //把 n以 %d 的格式写到 str 字符数组中去
printf("%.2lf", final); //C++的输出不提供四舍五入功能,若要四舍五入,上述为例: printf("%.2lf", final+0.005);
18.int To string
string str = to_string(int val); //参数可为其他类型,如 long、float、double等
#include <stdlib.h> char *str = "12345.67"; int n = atoi(str); //字符串转换为整数(atoi)、长整数(atol) double d = strtod(str,NULL); //字符串转换为浮点数,与atof()使用结果相同
string str = "0123"; 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[0] += 32; //A转小写 str[1] -= 32; //s转大写
//输入情况如下:7 5 31 5 88 67 88 17 个数不确定 //进行字符串转数字操作 string str; getline(cin, str); //接收一行数据 for(int i=0; i<str.length(); i++){ //数据处理 int j; for(j=i; j<str.length(); j++){ if(str[j] == ‘ ‘) break; } int x = 0; for(int k=i; k<j; k++){ x = x * 10 + str[k] - ‘0‘; } temp[num] = x; num++; i = j; }
//输入情况如下:7 5 31 5 88 67 88 17 个数不确定 //进行字符串转数字操作 string str; getline(cin, str); //接收一行数据 for(int i=0; i<str.length(); i++){ //数据处理 int j; for(j=i; j<str.length(); j++){ if(str[j] == ‘ ‘) break; } int x = 0; for(int k=i; k<j; k++){ x = x * 10 + str[k] - ‘0‘; } temp[num] = x; num++; i = j; }
//输入情况如下:7 5 31 5 88 67 88 17 个数不确定 //进行字符串转数字操作 string str; getline(cin, str); //接收一行数据 for(int i=0; i<str.length(); i++){ //数据处理 int j; for(j=i; j<str.length(); j++){ if(str[j] == ‘ ‘) break; } int x = 0; for(int k=i; k<j; k++){ x = x * 10 + str[k] - ‘0‘; } temp[num] = x; num++; i = j; }