天天看点

【个人用】算法竞赛c++常用工具,功能速查

【个人用】算法竞赛c++常用工具/函数,功能速查

    • 1,通用常用函数
    • 2,vector相关
        • (1)引用
        • (2)常用函数
    • 3,string相关功能
        • (1)引用
        • (2)基础函数
    • 4,栈
        • (1)引用
        • (2)基础函数
    • 5,map
        • (1)引用
        • (2)基础函数
    • 6,队列
        • (1)引用
        • (2)基础函数
        • (3)优先队列

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);
           

其余操作本质上和队列无区别。

——————————————分割线————————————————

先写这么多,有机会再更

继续阅读