一、声明
本篇作为C++算法竞赛小知识点的汇总整理,致力于实用化、精练化,将会持续更新。
二、正文
【1】输入输出那些事
(1)读入一行
char str[N];
int i=0;
while((str[i]=getchar())!='\n'){
i++;
}
/*or string str;
getline(cin,str);*/
(2)巧妙利用C进行格式读入输出
scanf("%d/%d/%d",&a,&b,&c); //读入2024/2/15形式
printf("%d-%02d-%02d\n",i,j,k); //输出2024-02-15加回车
(3)输出小数
cout<<fixed<<setprecision(3)<<x<<endl; //保留三位
(4)cin增速(关闭流同步)
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
(5)读入字符数组
char a[105];
cin>>a+1; //从下标1开始读入
【2】字符(串)与数字的缠绵
(1)字符(串)转数字
字符串转化 | stoi(string str) | stol() | stof() |
字符转化 | int(char c) | long() | float() |
注意:字符转化为ASCALL码
(2)数字转字符(串)
多位数 | to_string(int x) |
单位数 | char(int x) |
注意:单位数中 x 应为ASCALL码值
(3)ASCALL码
'A'——65 'a'——97 相差32 '0'——48
【3】常用的STL
(1)__gcd()与lcm()
int clm(int a,int b){
return a/__gcd(a,b)*b;
}
注意:最大公约数__gcd(a,b)在STL中,直接使用即可;而最小公倍数lcm不在,需要自己手写,如上。
(2)数字二分
lower_bound(a,a+n,x) | 查找不小于(大于或者等于)目标值x的第一个元素 |
upper_bound(a,a+n,x) | 查找大于目标值x的第一个元素 |
注意:得到的是地址,要输出值记得加*
(3)反转reverse()
数组:reserve(a,a+n) 字符串:reserve(a.begin(),a.end())
(4)强大的vector容器
vector确实是强化版数组,也可以下标直接访问,可以说数组可以干的都能干,不能干的也可以干,可以养成使用vector的习惯。
vector<int> a;//定义一个vector
vector<int> a(3);//定义一个长度为3的vector
vector<int> a(10, 3); //定义一个长度为10,且每个数赋值为3
vector<int>a(b.begin(),b.begin+3);//将向量b中从下标0 1 2(共三个)的元素赋值给a,a的类型为int型
//从数组中获得初值
int b[7]={1,2,3,4,5,6,7};
vector<int> a(b,b+7);
for(auto x : a) {//遍历输出
cout << x << " ";
}
a.size( )//返回元素个数
a.resize( )//改变大小
a.empty();//判断a是否为空
a.front();//返回a的第1个元素,当且仅当a存在
a.back(); //返回vector的最后一个数
a.clear();//清空a中的元素
push_back()//入器
pop_back()//出器
vector<pair<string,string>> v;//“坐标容器”
a.erase(p)//从a中删除迭代器p元素
a.erase(b,e)//从a中删除迭代器对b和e所表示的范围中的元素,返回e
reverse(a.begin(),a.end());//a的值为5,4,3,2,1 倒置
vector<int> a;
for (int i = 0; i < 10; i ++) {
a.push_back(i);
}
//三种遍历vector的方法
for (int i = 0; i < a.size(); i ++) {
cout << a[i] << ' ';
}
for (auto i = a.begin(); i != a.end(); i ++) {
cout << *i << ' ';
}
//C++11的新语法
for (auto x : a) {
cout << x << ' ';
}
——部分参考来源【C++】蓝桥杯必备 算法竞赛常用STL万字总结
(5)is_sorted()
sort()想必大家都不陌生,而is_sorted(beg,end,cmp)函数则是判断在 [beg,end) 中的元素是否符合cmp函数中的排序规则,若没有cmp则照旧按升序来看。
——练习使用可参考:is_sorted()函数的练习
【4】数字的魅力
long long最多存18位 int最多存10位
#define int long long
#define ll long long
注意:喜欢前者主函数应为signed main() 而不是int main(),同时确保程序中不会用到int()函数
【5】字符串的奥妙
(1)s1.find(s2,pos)
从s1的第pos个字符开始查找s2,找到返回第一个字符位置,找不到返回std::string::npos(很奇怪,但确实是这东西)。
具体用法结合例题更易理解,可参考