算法竞赛小知识汇总(C++)

一、声明         

        本篇作为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(很奇怪,但确实是这东西)。

具体用法结合例题更易理解,可参考


to be continued !

  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值