C++常用库及STL常用语句
常用库
uint64_t m; --8字节的整型,typedef定义取的别名
#include <cmath>
pow(a,b); --求a的b次方
ceil(2.5) = 3; --向上取整
floor(2.5) = 2; --向下取整
round(2.5) = 3; --四舍五入
round(2.4) = 2;
#include <algorithm>
max(a,b);
max({a,b,c});
min(a,b);
min({a,b,c});
swap(&i, &j);
sort(beginit,endit,cmp); --按cmp排序
sort(v.begin(), v.end(), greater<int>()); --按从大到小排序
bool cmp(int a,int b)
{
return a>b;
} --a>b,以降序排列,大的排前面
#include <string>
stoi(字符串,起始位置,几进制)
stoi(); --字符串转int
stol();
stod(); --
stof();
to_string(); --转化为string
aaa.size()-bbb.size(); --如果aaa的长度小于bbb的长度,返回值不是负数,会是无符号数的最大值
迭代器
类似指针的功能,但它实际上是类模板,只是重载了 -> ++ – 的功能。
容器构造例子
set<int>::iterator iter = a.begin();
*iter表示迭代器所指向的int
iter->first
iterator: --前向遍历,可读可写
const_iterator: --前向遍历,只读
reverse_iterator: --后向遍历,可读可写
const_reverse_iterator: --后向遍历,只读
容器a
a.begin(); --返回一个迭代器指向容器的第一个元素。
a.end(); --返回一个迭代器指向容量的最后一个元素的下一位置。
a.rbegin(); --返回反向迭代器的开始,即指向原容器的最后一个元素。
a.rend(); --返回反向迭代器的最后一个元素的下一个位置,即指向原容器的第一个元素之前的位置。
2.stack
stack<int> s;
stack< int, vector<int> > stk; //覆盖基础容器类型,使用vector实现stk
s.empty(); //判断stack是否为空,为空返回true,否则返回false
s.size(); //返回stack中元素的个数
s.pop(); //删除栈顶元素,但不返回其值
s.top(); //返回栈顶元素的值,但不删除此元素,如果栈为空,用top()会报错
s.push(item); //在栈顶压入新元素item
3.queue
3.1 queue 队列常用语句
#include <queue>
queue<int> q;
q.empty(); --判断队列是否为空
q.size(); --返回队列长度
q.push(item); --对于queue,在队尾压入一个新元素
q.pop(); --删除队头元素,不返回其值
q.front(); --返回队首元素的值,但不删除该元素,注意:这不是迭代器,queue only
q.back(); --返回队尾元素的值,但不删除该元素,注意:这不是迭代器,queue only
3.2 priority_queue优先队列常用语句
#include <queue>
//构建方法
priority_queue<int> pq; --会排序,队头元素最大;
priority_queue<pair<int,int>> pq; --会排序,先按pair的first元素降序排列,再按second元素降序排列
priority_queue<pair<int,int>, vector<pair<int,int>>, mycompare> pq; --完整构建priority_queue需要三个参数,第一个数据类型,第二个保存数据的容器,第三个元素比较方式。
//比较函数写法
class mycompare{
public:
bool operator()(const pair<int,int>& par1, const pair<int,int>& par2){
return par1.second > par2.second; --返回true表示需要更改位置,false表示就按par1,par2的顺序
}
};
pq.empty(); --判断队列是否为空
pq.size(); --返回队列长度
pq.push(item); --对于queue,在队尾压入一个新元素
pq.pop(); --删除队头元素,不返回其值
pq.top(); --返回具有最高优先级的元素值,但不删除该元素,注意:这不是迭代器,priority_queue only
set
#include <set>
set<int> s; --不能含有重复元素,有序,小顶堆
set<int, greater<int>> s; --大顶堆
s.insert() --在集合中插入元素
s.clear(); --清除所有元素
s.erase(); --删除集合中的元素
s.size(); --集合中元素的数目
s.find(); --返回一个指向被查找到元素的迭代器,没有查找到返回s.end()
s.count(); --返回某个值元素的个数
multiset
#include <set>
multiset<int> ms; --可以含有重复元素,有序,小顶堆
multiset<int, greater<int>> ms_great; --大顶堆
ms.insert() --在集合中插入元素
ms.clear(); --清除所有元素
ms.erase(); --删除集合中的元素,如果有多个1,会把所有1都删除掉
ms.erase(ms.find(1)); --如果有多个1,只会删除其中一个1
ms.size(); --集合中元素的数目
ms.find(); --返回一个指向被查找到元素的迭代器,没有查找到返回s.end()
ms.count(); --返回某个值元素的个数
multiset<int>::iterator iter = s.insert(10); -- 返回插入值的迭代器
map
map key值有序,数值不可以重复,底层实现是红黑树,key值不能更改,查询效率logn,增删效率logn
--反向迭代器,也是用it++,注意是reverse_iterator
for(map<int,int>::reverse_iterator it = m.rbegin(); it != m.rend(); it++){
cout<<it->first<<endl;
}
multimap
#include <map>
multimap<string, string>::iterator bookit1, bookit2;
bookit1 = book.lower_bound("古龙");
bookit2 = book.upper_bound("古龙");
while (bookit1 != bookit2) {
cout << bookit1->second << " ";
bookit1++;
}
unordered_map
key无序,哈希表实现,key不可重复,插入查找复杂度O(1)
#include <unordered_map>
unordered_map<int,int> umap;
umap[5]++;
umap.insert(pair<int,int>(5,6)); --5是key,6是val
iter = umap.find(key)
vector
#include <vector>
vector<int> v;
vector<int> v1 = {1,2,5,97,56, 33, 2, 5, 3};
v.push_back();
v.pop_back();
v.begin(); --得到v的头结点指针
v.end(); --得到v的尾结点指针,尾结点是数组最后一个元素后面的节点
v.front(); --得到数组第一个元素
v.back(); --得到数组最后一个元素
v.size(); --得到数组的长度
v.clear(); --清空数组
v.empty(); --判断数组是否为空
v.rbegin(); --返回最后一个节点的指针,end-1
v.rend(); --类似end,begin-1
v.erase(iter); //删除指定位置的元素,返回值是一个迭代器,指向删除元素的下一个元素
v.insert(v.end(), v.begin(), v.end()); //在最后插入一个vector
string
#include <string>
string s;
s = "hello";
s = string(str1,0,5); --s为str1从0字符开始取5个字符
s.size(); --获取字符串长度
s.insert(pos,str); --在s字符串pos(0-index)位置插入字符串str
s.replace(pos,n,str); --删除s字符串pos开始的n个字符替换为str
s.push_back(char); --在s字符串末尾插入一个字符
s.append(str); --在s字符串末尾插入字符串str
s.append(str+'a'+"b"); --可以用+在末尾增加
s += to_string(nowi)+'+';
s.erase(pos,n); --删除s字符串从pos开始的n个字符
s.find(str); --查找字符串str在当前字符串s中第一次出现的位置
s.find(str, pos); --查找字符串str在当前字符串s的[pos,end]中第一次出现的位置
reverse(s.begin(),s.end()); --反转字符串
string s="abcde";
string a=s.substr(0,3); --“abc”
string b=s.substr(1); --"bcde"
string c=s.substr(2,3); --"cde"
--判断str2是否是str1的子串,不是返回NULL,是返回str2在str1的首次出现的地址
char str2 = “cdef”;
char str1 = “abcdefgh”;
strstr(str1,str2) = cdefgh;
s.find(str,pos); --从字符串的pos位置开始,查找子字符串str。如果找到,则返回该子字符串首次出现时其首字符的索引;否则,返回string::npos
s.rfind(); --方法查找子字符串或字符最后一次出现的位置,否则,返回string::npos,npos为无符号int或无符号long的最大取值
if(s.find(str,pos) != string::npos) return;
--字符构建的数组结尾处有‘\0’
char a[5] = "asd";
for (int i = 0; a[i] != '\0'; i++) {
}
正则表达式regex
#include<regex>
regex r(".*@.*");
string str;
if (regex_match(str, r)) {
cout << "匹配成功";
}
else {
cout << "匹配失败";
}
ACM模式常用
当 cin 读取到 John 和 Doe 之间的空格时,它就会停止阅读,只存储 John 作为 name 的值。在第二个输入语句中, cin 使用键盘缓冲区中找到的剩余字符,并存储 Doe 作为 city 的值。
#include <iostream>
#include <string>
int a;
int b;
cin >> a;
cin >> b;
(输入10 100)
--cin读取到两者之前的空格时会停止阅读,只存储10作为a的值,第二个输入时,cin在键盘缓冲区找到剩余字符,并存储100作为b的值。