【个人用】算法竞赛c++常用工具/函数,功能速查
1,通用常用函数
【世界上最好用的快速排序】
sort(xxx.begin(),xxx.end());//xxx可以是很多东西,begin和end是首尾指针。
nth_element(xxx.begin(),xxx.begin()+n,xxx.end());//有限快速排序,仅排序从0到n
【匿名函数】(这里用sort举例)
sort(xxx.begin(),xxx.end(),[](int a,int b)->bool{
return a>b;
});//当然这里也可以定义一个com函数来改变,但是匿名函数有时候也挺好用的。
【次方】
pow(float,int);//float指参数,int指几次方,返回值是float
pow(4.0,2);
【开方】
sqrt();//没什么好说的
【去重】
v.erase(unique(v.begin(), v.end()), v.end());//对迭代器范围内去重
【获取一行输入】
getline(cin,str);//这里的str是string类型的
【其他】
std::ios::sync_with_stdio(false);//注意加上这句以应对大量IO
【遍历容器】
vector<int>nums;
for(auto x : nums)//快速遍历容器
{
if(x>0);
}
【保留几位小数】
#include <iomanip>
cout<<fixed<<setprecision(2);//保留2位
cout<<flt;//输出
【二分查找/查找】
lower_bound(起始地址,结束地址,要查找的数值)
//大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置.
upper_bound(起始地址,结束地址,要查找的数值)
//返回大于val的第一个元素位置
binary_search(起始地址,结束地址,要查找的数值)
//返回的是是否存在这么一个数,是一个bool值。
举例:int *p = upper_bound(vec.begin(),vec.end(), 3);
举例2:int low=lower_bound(t.begin(),t.end(),5)-t.begin();
【自动分组】
bool mycomp(int i) { return (i % 2) == 0; }
std::vector<int> myvector{1,2,3,4,5,6,7,8,9};
//以 mycomp 规则,对 myvector 容器中的数据进行分组,这里的例子是对奇偶分组
std::partition(myvector.begin(), myvector.end(), mycomp);
2,vector相关
(1)引用
#include<vector>
using namespace std;
vector<int> vec;
(2)常用函数
【增删】
vec.push_back(a);//将a加入vec并压到最后
vec.pop_back();//删除尾部元素
【大小】
vec.size();//获取当前vec的大小
【头尾指针,排序】
vec.begin();//获取vec头指针
vec.end();//获取vec尾+1指针
sort(vec.begin(),vec.end());//对vector的快速排序
【清空】
vec.clear();//清空
【其他】
vec.assign(6,10);//设置vec为6个10(就是现在储存的内容是10,10,10,10,10,10)
vec.swap(vec2);//与vec2交换数据
【值获取】
int a = vec[0];//直接调用数据
vector<int>::iterator it;//声明一个迭代器,来访问vector容器
for(it=vec.begin();it!=vec.end();it++){cout<<*it<<" ";}
3,string相关功能
(1)引用
#include<string>
using namespace std;
string str;
(2)基础函数
【有点好用的构建】
string str("Hello"); // s2 = "Hello"
string str(4, 'K'); // s3 = "KKKK"
string str("12345", 1, 3); //s4 = "234",即 "12345" 的从下标 1 开始,长度为 3 的子串
【长度】
str.length();//返回值为int
【得到子串】
str.substr(int a,int lon);//获取字符串从下标a开始,长度为lon的字符串,返回string
【交换字符串】
str.swap(str2);//交换字符串
【链接字符串】
string s1("123"), s2("abc");
s1.append(s2); // s1 = "123abc"
【查找子串】
查找子串和字符的成员函数,它们的返回值都是子串或字符在 string 对象字符串中的下标,如果没有找到任何东西,就返回string::npos
str.find('a');
str.find('a',3);//从下标3开始往后找
str.find("aaa");
if(str.find("aaa") == string::nops)//存在
if(str.find("aaa") != string::nops)//不存在
str.find_first_of("a");//第一次出现a的位置
str.find_last_of("a");//最后一次
s1.find_first_not_of("aut", 2);//从下标2开始找,第一次出现非a、u、t的字符
4,栈
(1)引用
#include <stack>
using namespace std;
stack<int>sta;
(2)基础函数
【获取顶元素】
sta.top();
【进栈出栈】
sta.push(int a);
sta.pop();
【确定是否为空】
sta.empty();//为空则返回1
【大小和交换】
sta.size();
sta.swap(sta1);
5,map
(1)引用
#include <map>
using namespace std;
map<int, string>ma;
(2)基础函数
【插入】
ma.insert(pair<int, string>(0, "aaa"));
ma.insert(map<int, string>::value_type(1, "nnn"));
month_name["July"]=7;//这样的方式也可以
mp[a]=b;//就是楼上的方式
【查找】
map<int, string>::iterator = ma.find("nnn");
// 找到,迭代器指向当前查找元素的位置,否则返回end()
mp[a];//直接拿到
6,队列
(1)引用
#include<queue>
using namespace std;
queue<int> qu;
(2)基础函数
【出入】
qu.push(x);//压入到队尾
qu.pop();//出队首
【获取队首队尾】
qu.front();//获取队首元素
qu.back();//获取队尾元素
【获取队列信息】
qu.empty();//返回队列是否为空
qu.size();//返回队列大小
(3)优先队列
优先队列特性:插入元素后根据大小排列,出队时,先出最大。
priority_queue <int> pq;//声明
pq.top();
pq.pop();
pq.push(x);
其余操作本质上和队列无区别。
——————————————分割线————————————————
先写这么多,有机会再更