C语言转C++需掌握的基本语法

 语法篇:

头文件声明:

#include<iostream> => 相当于c语言stdio.h

#include<cmath> => 相当于c语言math.h

什么.h可以转化为c什么来代替

使用库说明:

不同厂商不一样可能发生冲突

using namespace std;

如果没有声明,在运用到里面函数时就要std::cin

输入输出说明: cin >> 变量;

getline(cin,a); //可以输入带有空格的字符串

count << 变量 << endl; //endl是换行符

变量.length(); //读取字符串长度

变量.substr(n,m) 或 变量.substr(n);//取子串

这里的n是从第几个字符开始,m是n后面取几个字符

结构体:

定义结构体后可以直接用struct后面那个单词来定义结构,免去了c语言里typedef的步骤

引用&:

引用符号可以将所引用的参数传递,可以修改该参数的值,免去了c语言用指针传值的步骤

STL篇:

vector:

头文件加上include<vector>

可变数组的定义:

vector <int>数组名;

vector <int>数组名(10);//分配十个空间,每个空间初始化为0

vector <int>数组名(10,2); //分配十个空间,每个空间初始化为2

数组名.resize(数字); //分配数组大小,初始化也为0

数组名[i]; //访问里面的元素 

v.push_back(数字) //末尾添加新的数据

迭代器:

for(auto p = v.begin() ; p != v.end() ; p++ )

此处定义v为数组名,与循环一样遍历数组里的每一个元素

v.end的实际位置是在数组里最后一个元素的下一个位置

输出时为*p,这里的p相当于指针

set:

头文件加inlude<set>

set是集合,它里面的元素各不相同,而且元素会按照从小到大排序

set <int>数组名;//数组名后面不能带数字/空间

s.insert(数字) //给集合添加内容/数字

s.find(数字) //返回值是一个指针 与s.end作比较

s.find(2) != s.end() //返回的是布尔值

s.erase(数字) //把数字1删除

map:

头文件加上include<map>

map是键值对,它会自动将所有的键值对按照键从小到大排序

可以看作是一个结构体,一个键值对是一个结构体,类似定义了一个结构体数组

map <string, int > 名字;

名字["hello"] = 2 //添加元素

for( auto p=m.begin() ; p != m.end() ; p++ )

cout << p->first << ":" << p->second << endl

//用来获取所有的键值对

m.size() //获取map的长度,有几个键值对

stack:

头文件加上include<stack>

stack <int> 名字

名字.push(数字) //添加元素

名字.top() //获取栈顶元素

名字.pop() //出栈,把栈顶元素去掉

名字.size() //获取长度

不能用迭代器,因为栈只能对栈顶进行操作

queue:

头文件加上include<queue>

queue <int> 名字

for(int i = 1; i<=10; i++)

s.push(i) //添加元素

s.front() //访问队首元素

s.back() //访问队尾元素

s.pop() //出队,队首出队

s.size() //获取长度

unordered_map unordered_set:

头文件加上include<unordered_map>

头文件加上include<unordered_set>

这两个其实就是不会排序的map和set,他们省去了排序的过程,如果刷题的时候超时了,可以使用这两个

他们的输出是没有规律的

C++11篇:

auto:

用auto声明变量: 作用:可以让编译器根据初始值直接推断变量的类型

注意:在声明变量的时候就要给它初始值

迭代器可以作用的:

数组,集合,键值对(获取值类似于结构指针)

不可以:

栈,队列

基于范围的for循环:

传值:输出数组中的每一个元素的值,这里不能改变元素的数值


#include<iostream>
#include<vector>
using namespace std;

int a[5] = {1}; // 1 0 0 0 0

int main(void)
{
    for (int i:a)
    {
        i++;
        count << i << " ";
    }
    cout << endl;
    
    return 0;
}

//输出结果为2 1 1 1 1,这里改变了值是因为输出放在了里面
#include<iostream>
#include<vector>
using namespace std;

int a[5] = {1}; // 1 0 0 0 0

int main(void)
{
    for (int i:a)
    {
        i++;
    }
    for(int i:a)
        count << i << " ";
    
    cout << endl;
    
    return 0;
}

//输出结果为1 0 0 0 0,这里未改变了值是因为输出放在了外面,说明该循环本身不能改变数组中元素的值

传址:只有在引用时才能改变元素的值

#include<iostream>
#include<vector>
using namespace std;

int a[5] = {1}; // 1 0 0 0 0

int main(void)
{
    for (int &i:a)
    {
        i++;
    }
    for(int i:a)
        count << i << " ";
    
    cout << endl;
    
    return 0;
}

//输出结果为2 1 1 1 1,这里改变了值是因为该循环本身能改变数组中元素的值

推广:

for(auto i:v)
    cout << i << " "

这里的v是一个vector,其实所有的容器都可以使用这种方式来循环。(配合auto)

to_string:

头文件加上include<string>

作用:将数字转化为字符变量

#include<iostream>
#include<string>
using namespace std;

int main(void)
{
    string s = to_string(123.1)
    
    count << s << endl;
    
    printf("%s\n",s.c_str());
    
    return 0;
}

stoi stod:

作用:将字符串转化为其他变量

处理:stoi 转化为int

stod转化为double

#include<iostream>
#include<string>
using namespace std;

int main(void)
{
    int a = stoi("123");

    count << a-1 << endl;
    
    double b = stod("12.34");
    cout << b-1;
    
    return 0;
}

进阶篇:

位运算:

头文件加上include<bitset>

bitset类似一个字符数组,但是它是从二进制的低位到高位依次为b[0],b[1]......,所以按照b[i]的方式输出和直接输出b的结果相反

bitset <5> b(19) 输出的二进制位数为5位 二进制转十进制后为19

如果括号里为字符串,默认放最后两位其余位补0

cout << b << endl  //输出可以直接当字符串输出

b.any() //是否有1存在,返回bool值

b.none() //b不存在1吗

b.count()  //b中1的个数

b.size()  //b中元素个数 

b.test(i)  //下标为i处是不是1

b.set(i)  //把下标i处设置为1

b.reset()  //所有位归零

b.reset(i)  //第i位归零

b.flip()  //所有位取反

b.flip(i)  //第i位取反

unsigned long a = b.to_ulong() //转换为unsigned long类型

sort:

头文件加上include<algorithm>

头文件加上include<vector>

主要功能是对一个数组(int arr[]或者vector)进行排序。vector是容器,需要用v.begin()表示头,v.end表示尾;而int arr[]使用arr表示数组的首地址,arr+n表示尾部

sort( m.begin(), m.end() ) //[ )

使用sort自定义cmp函数:

cmp允许我们定义一些比较复杂的函数的规则

bool cmp(int x,int y)

如果返回值为真。那么x放在y前面(返回值为假时,交换两个数) 否则x放在y后面

注意:cmp返回值部分必须使用>或者<,不能有>=或者<= 否则可能出现段错误

数组:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

bool cmp(int x, int y)
{
    return x > y;
}

int main(void)
{
    vector <int> v;

    for(int i=1; i<=10; i++)
        v.push_back(i);

    sort(v.begin(), v.end(), cmp);

    for(auto p=v.begin(); p!=v.end(); p++)
        cout << *p << " ";

    cout << endl;
    
    return 0;
}

结构体:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

struct stu
{
    string name;
    int age;
};

bool cmp(int x, int y)
{
    if(a.age != b.age)
        return a.age < b.age;
    else
        return a.name < b.name;

int main(void)
{
    stu s[3];

    for(int i=1; i<3; i++)
        cin >> s[i].name >> s[i].age;

    sort(s, s+3, cmp);

    for(int i=0; i<3; i++)
        cout << s[i].name << " " << s[i].age << endl;

    
    return 0;
}

cctype:

头文件加上include<cctype>

对字符进行操作

isalpha()  //是不是字母

islower()  //是不是小写字母

isupper()  //是不是大写字母

isalnum()  //是字母或者数字其中一类吗

isspace()  //是space \t \r \n 其中一个吗

tolower() //转化为小写字母

toupper()  //转化为大写字母

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值