刷题常用c++

基本数据类型的定义

绝对值在10^9范围以内可以定义成int型,在10^18范围以内定义成long long型,

long long型赋值大于2^31-1的初值,需要在初值后面加上LL,否则会编译错误

printf 输出格式

%md不足m位的int型变量以m位右对齐输出,%-md以左对齐方式输出, 若数值大于m位,保持原样输出

%0md变量不足时用0填补

%.mf让浮点数保留m为小数

常用的#include<cmath>;头文件

fabs(double x);//对double取绝对值

floor(double x);//对x向下取整

ceil(double x);//对x向上取整

pow(double r,double p);//r^p 

sqrt(double x);//算数平方根

log(double x);//以自然对数为底的对数

sin(double x)、cos(double x)、tan(double x)//正弦、余弦、正切值

asin(double x)、acos(double x)、atan(double x)//反正弦、反余弦、反正切

round(double x);//对x四舍五入

**上面函数参数要求为double类型 **

string

初始化

string s;//默认初始化,一个空字符串

string s1("ssss");//s1是字面值“ssss”的副本

string s2(s1);//s2是s1的副本

string s3=s2;//s3是s2的副本

string s4(10,'c');//把s4初始化,长度为10的 c的字符串

string s5="hiya";//拷贝初始化

string s6=string(10,'c');//拷贝初始化,生成一个初始化好的对象,拷贝给s6

 //char cs[]="12345";
string s7(cs,3);//复制字符串cs的前3个字符到s当中

// string s8="asac";
string s9(s8,2);//从s8的第二个字符开始拷贝,不能超过s8的size

//string s10="qweqweqweq";
string s11(s10,3,4);//s11是s10从下标3开始4个字符的拷贝,超过s10.size出现未定义

常用函数

//字符串中的find函数,若找不到字符,会返回string::npos,即是-1;
string s1=“hello,word";
if(s1.find(h)!=string:npos)
    flag=1;
string 类提供了 6 种查找函数,每种函数以不同形式的 find 命名。
这些操作全都返回 string::size_type 类型的值,以下标形式标记查找匹配所发生的位置;
或者返回一个名为 string::npos 的特殊值,说明查找没有匹配。string 类将 npos 定义为保证大于任何有效下标的值。
 s.find("ha",3)//从位置3开始查找“ha”子串
s.find*()
    
s1.erase(4,1);//去除4位置上 一个字符
s1.erase(3);//从位置3开始去除字符到结尾

//在0位置插入len个'0'
s.insert(0,len,'0');

sort(s1.begin(),s1.end(),cmp);//给s1字符串中排序

s.length() s.size()//取串的长度

string s2=s.substr(4);//从下标4开始一直到结束
string s3=s.substr(5,3) //从下标5开始 截取3个字符
 
s.append(s2);//append()函数可以用来在字符串的末尾追加字符和字符串。由于string重载了运算符,也可以用+=操作实现

s.compare(s2)//和strcmp函数一样,如果两个字符串相等,那么返回0,调用对象大于参数返回1,小于返回-1

vector

动态数组或者不定⻓数组它能够在运⾏阶段设置数组的⻓度、在末尾增加新的数据、在中间插⼊新的值、⻓度任 意被改变

定义

  • 头文件 #include<vector>

  • 不指定大小 vector<int> v;

  • 定义时指定大小且默认初始都是0 vector<int> v(10);

  • 定义时指定大小并将所有元素赋特定的值 vector<int> v(10,2);

常用方法

v.size();      //输出vector v的大小
v.resize(8);    //将vector v的大小设为8,且默认值是0
v.push_back(i);          // 在vector v的末尾添加一个元素

set

set 是集合,⼀个 set ⾥⾯的各元素是各不相同的,⽽且 set 会按照元素进⾏从⼩到⼤排序

定义

头文件 #include <set>;

定义空集合 set<int> s;

常用方法

s.size();      //输出set s的大小
s.insert(1);          //向集合s中插入一个1
s.find(2);            //返回一个指向被查找到元素(2)的迭代器
s.eraser(1);            //删除set中值是1的元素

map

map 是键值对,会⾃动将所有的键值对按照键从⼩到⼤排序

定义

  • 头文件 #include <map>

  • 定义map map<string,int> m

常用方法

m.size();      //输出map m的大小
m["hello"] = 3;         //向map m中键hello的值改为3
⽤迭代器it遍历,输出map中所有的元素,键⽤it->first获取,值⽤it->second获取 

stack

定义

  • 头文件 #include <stack> ;

  • 定义stack stack<int> s;

常用方法

s.size();        //栈的元素个数
s.push(i);      //向stack s中加入元素i
s.top();        //取出栈顶元素
s.pop();          //弹出栈顶元素

queue

定义

  • 头文件 #include<queue>;

  • 定义 queue<int> q;

常用方法

q.size();          //队列的元素个数
q.push(i);          //像队列中压入i
q.front();          //取出队首元素
q.pop();             //弹出队首元素

unordered_map和unordered_set

省去了这个排序的过程,如果偶尔刷题时候⽤ map 或者 set 超时了,可以考虑 ⽤ unordered_map (或者 unordered_set )缩短代码运⾏时间、提⾼代码效率

定义

  • 头文件 #include<unordered_map>

#include<unordered_set>

常用方法

⽤法和 map 、 set 是⼀样的

bitset

处理二进制位的有序集,每个位可能包含的是0(关)或1(开)的值。bitset类型对象的区别仅在其长度而不在其类型。在定义bitset时,要明确bitset含有多少位,须在尖括号内给出它的长度值。

定义

  • 头文件 #include<bitset>;

  • 定义bitset里面都为0 bitset<5> b;

  • 指定bitset里面的值可以是unsigned int和字符串 bitset<5> b(s);

  • 指定bitset中的内容是某字符串中i开始的n长度的部分 bitset<5> b(s,i,n);

常用方法

cout << b <<endl;       //以正常顺序输出
cout << b[i] << endl;    //按位输出是逆序,是从二进制的低位到高位
b.any();                   //b中是否此存在1的二进制位
b.none();                    //b中不存在1吗
b.count();               //b中1的二进制位的个数
b.size();                //b中二进制位的个数
b.test(2);                //b中下标位2的地方是否是1
b.set(4);                  //把b中下标是4的位置置1
b.reset();                 //b中所有位清0
b.reset(3);                  //b中下标位3处的位置清零
b.flip();                      //b的所有二进制位逐位取反
unsigned long a = b.to_ulong(); //b转换为unsigned long类型 

sort函数

主要是对一个数组进行排序(int arr[]数组或者vector

数组都行)

定义

  • 头文件 #include<algorithm>;
  • 底层类似于快速排序

用法

sort(起始地址,结束地址,排序函数地址(默认非降序))

  • 对于int arr[]来说是sort(arr, arr+n);

  • 对于vector容器来说是```sort(v.begin, v.end);``

  • 对于自定义的排序函数,更多的是在结构体中来使用

    柳神的小例子,如果分数不同则从高往底排序,如果分数相同则按学号的大小排序

    struct stu
    {
        int number;
        int score;
    }
    bool cmp(stu a,stu b)
    {
        return a.score!=b.score ? a.score > b.score : a.number < b.number);
    }
    

    并且sort中自定义的函数的返回值只能按照规定来写,return a > b;或者return a < b;不可以>=或者<=;

    cctype头文件

    里面包含一些刷题常用到的判断字符的函数

    常用方法

    isalpha  字母
    islower   小写字母
    isupper    大写字母
    iaslnum     字母和数字
    isbank       space和\t
    isspace      space,\t,\r,\n     //\r是将光标位置移到本行的开始
    tolower       大写转小写
    char t = tolower(c);
    toupper       小写转大写
    char t = toupper(c);
    
    char c;
    cin >> c;
    if(isalpha(c))  cout << "is alpha" << endl;
    

auto声明

根据变量的初始值直接判断变量的类型

auto a = 100.0;

主要的使用是在用迭代器遍历容器的时候,我说一下自己对于迭代器的一点浅显的理解:

每一种容器中都定义了自己的迭代器iterator,在定义容器的源码中,容器的的类中有一个内部类定义的是迭代器,我们定义的迭代器实际上就是该类的一个对象,所以如果不加auto声明的时候应该写成(这里用set来举例子)

set<int>::iterator it;

而set中还有获取set的首末(末尾的下一个地址)的地址等类似函数,且iterator源码中的定义就是一个指向自己所在的容器的元素的指针因此有it = s.begin();等。

所以在遍历容器的时候我们可以很方便的写成

for(auto it = s.begin();it != s.end();it ++)

基于范围的for循环

  • 如果要输出arr[]数组中的每个元素

    for(int i : arr)
        cout << i << endl;
    
  • 如果要输出容器中的每个元素用vector来举个列子

    for(int i: v)
        cout << i << endl;
    

这种写法只能用来输出元素的值,不可以改变元素的值,如果想要修改值得话,必须要int &i

   ```C++

for(int &i : arr)
i = i * 2;
```

string和数值之间的转化

to_string

to_string最常用得方法就是将一个int,float。double等转化成string字符串

float a = 123.0;
string s = to_string(a);

关于转化后得字符串长度还没搞清楚怎么回事,搞懂之后会做修改

stoi``````stod``````stol

将string转化成int,double,long,这里得string只能是数值型得字符串

string s = "345";
int a = stoi(s);
for(int &i : arr)
  i = i * 2;
     ```



# string和数值之间的转化

## to_string

to_string最常用得方法就是将一个int,float。double等转化成string字符串

```C++
float a = 123.0;
string s = to_string(a);

关于转化后得字符串长度还没搞清楚怎么回事,搞懂之后会做修改

stoi``````stod``````stol

将string转化成int,double,long,这里得string只能是数值型得字符串

string s = "345";
int a = stoi(s);

本文结合了柳婼大神的从C到C++和我同学一些整理,建议大家可以去买一份柳婼大神的文档很不错哦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值