C++ 速成_b站up我头发多我还能学

头包

#include <iostream>

using namespace std;

万能头

#include<bits/stdc++.h>    // 万能头,记住
using namespace std;

输出cout

endl 换行

cout<<"hello c++"<<endl;     //输出字符串,endl换行

char c = 'c';                              //定义字符变量

cout<<c<<endl;                       //输出字符变量

string str = "hello";                  //定义字符串变量

cout<<str<<endl;                     //输出字符串变量

输出保留两位小数 printf

float f = 3.3333;

printf("%.2f",f);       //输出 3.33

const 只读

const int a = 10;      // 变量a 初始化后不可修改

auto 相当于泛型

auto a = 10;

auto b = "hello world";

auto c = true; 

字符串

字符串 + 法运算

string str1 = "hello ";

string str2 = "world!";

string str3 = str1+str2;        //str3 = "hello world!"

获取字符串长度 size()

s.size();

strlen 获取字符串长度 stdio.h 包

strlen(str);

判空函数 empty()

s.empty();

字符串按索引查找字符,可以当成数组[]

s[index];

子串查找find(),返回索引

string s = "hello world!";

int pos = s.find("llo");        //返回 pos = 2

int pos2 = s.find("xjz");     //未找到,返回无效索引 pos=string::npos

if(pos2==string::npos)    cout<<"未找到";    

子串替换 replace(int start , int end, string str)      //左闭右开

string s = "HelloYou";

s.replace(5,8,"Xjz");    //输出HelloXjzld

cout<<s;

截取子串 substr(int startindex , int size);

string s = "Helloyou";

string s2 = s.substr(5,3);     //s2 = "you"

cout<<s2;

//size 大于原串长度,则截取往后全部,不会报错

string s3 = s.substr(5);    //表示截取从5到后面全部,s3 = "you"

字符串插入insert

 字符串 str.insert(index,size,char) 在指定下标插入长度为size的字符,用来填充前导0

A.insert(0,lenB-lenA,'0');    // 字符串insert(index,size,char) 在指定下标插入长度为size的字符

字符串输入 getline 获取整行

cin 默认接收到 空格/回车 后退出,用 getline 读整行不会被空格截断。

string s1;

getline(cin,s);    //读整行,不会被空格截断

翻转字符串

//引入 algorithm 包
reverse(str.begin(),str.end());        //翻转字符串

要修改形参需要加 & 符

getchar();    //输入字符,可以用来吸收回车键

工具——编译选项——编译器——编译时加入这个命令——

-std=c++11

转型

字符串->整型stoi

string a = "100";

int aa = stoi(a);

整型->字符串to_string

string aaa = to_string(aa);

输入cin,默认用空格或回车间隔

int a;

float b;

cin>>a>>b;         //默认用空格或回车间隔

数组

数组定义和初始化

int arr[5] = {1,2,3,4,5};

string str[2] = {"acdc","d"};

数组初始化

 memset 函数用法 memset(矩阵地址,指定值,大小)

 long long color[n+2][m+2];
 memset(color, -tol  ,sizeof(color) );

加强 for 循环

for(auto i : arr){

        cout<<i<<" ";

}

把二维数组当形参传递时 int (*nums)[100]

int nums[100][100];

void exchange(int (*nums)[100],int n,int cur,int max){}

exchange(nums,n,i,max)

  • (*nums):这表示 nums 是一个指针,因为 * 是指针解引用操作符。即 *nums 表示指针指向的值,类型是一个长度为 100 的整型数组。
  • [100]:这表示指向的值是一个长度为 100 的整型数组。

容器 vector 

头文件

#include <vector>

初始化

vector <int> vec = {1,2,3,4,5};

按索引顺序读取元素[]

vector <int> vec = {1,2,3,4,5};

vec[1]==1;

获取 vector 的大小 size()

vec.size();    //输出5

vector 递增排序

sort ( vec.begin() , vec.end() );

vector 作形参改变值要加 引用&

vector 加强 for 循环,改变值要加 引用&

for(auto &p : vec){     //加 & vec里的值才会真的修改

        if(p==3) p=300;

}

vector 迭代器

for(vector<int>::iterator it = vec.begin() ; it != vec.end() ; it++ ){

        cout<<*it<<endl;    // it是指针,指向地址,需要加取地址符*

}

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

        // vector.begin();   为第一个元素的地址

        // vector.end();   为最后一个元素后面的一个地址,实际指向空

}

vector.begin() 和 vector.end()

vector.begin();  为第一个元素的地址

vector.end();   为最后一个元素后面的一个地址,实际指向空

二维数组

    vector<int> vec[n];             // n 个 vec 动态数组
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            int temp;
            cin>>temp;
            vec[i].push_back(temp);
        }
    }

在末尾添加元素 push_back()

vec.push_back();

在指定位置添加元素 insert(int pos , int element)

pos 要传入地址 vec.begin()+index

vector<int> vec = {1,2,3,4};

vec.insert(vec.begin()+1 , 100);     //vec={1,100,2,3,4}

删除末尾元素 pop_back() ,返回 null

vec.pop_back();

删除指定位置元素 erase(int pos);

vector<int> vec = {1,2,3,4};

vec.insert(vec.begin()+1,100);     //vec={1,100,2,3,4}

vec.erase(vec.begin()+1);    //vec={1,2,3,4}

清空所有元素 clear()

vec.clear();

如果要把容器当数组作形参传递

void fun(string str[], int size){

}

vector<string> vec;                  // 定义容器

string *str = vec.data();            // 得到容器的索引    

fun( str , vec.size());

set 容器

特点:

自动去重

自动递增排序

头文件

#include <set>

查找 find(auto element)

用set 容器在集合中查找操作 find(),返回值为一个地址。

string 的find 返回的是索引下标,注意区分。

ss.find(val)!=ss.end();       //查找成功

ss.find(val)==ss.end();      //查找失败

set<int> ss = {1,2,3,4,5};

if(ss.find(2)!=ss.end()){

        cout<<"查找成功";

}

插入 insert(auto element)

set<int> ss = {1,2,3,4,5};

ss.insert(1);          //不能插入重复元素,但不报错。自动去重

ss.insert(100);     // {1,2,3,4,5,100}

ss.insert(50);       // {1,2,3,4,5,50,100}。自动排序

迭代器遍历 set

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

        cout<< *it;

}

unordered_set 容器

特点

无序。本质上是 hash表 ,时间复杂度 O(1);

set 本质上是红黑树,时间复杂度更高。

map 集合

特点:

存放键值对

自动根据 key 值升序排序

定义和初始化

map<string,int> m;
m["aaa"] = 10;

m["bbb"] = 15;

增加键值对

m["ccc"] = 20;

获得键 e.first / 获取值 e.second

for( auto e :m){

        cout<<e.first<<" "<<e.second;

}

unordered_map 集合

无序

结构体

定义、初始化、访问属性

//定义

struct Student{

        int age;

        string name;

        float score;

};

int main(){

        //初始化

        Student s = {18,"xjz",66.0};

        //访问属性

        s.name = "hsp";

        return 0;

}

在存入vector的同时对结构体初始化

struct Student{
    string id;
    int Gp;
    int Gm;
    int Gf;
    int g;
};

vector<Student> vec;

string id; 

int Gp_score;
cin>>id>>Gp_score;

vec.push_back( Student{id,Gp_score,-1,-1,0} );   // 把student初始化存入vector保存

链表

struct ListNode{

        int val;

        ListNode *next;

};

指针

空指针 nullptr

定义指针

int* p;    // p 是一个指针类型的变量

取地址

int a = 10;

int* p;

p = &a;       //p 指向 变量a的地址

cout<<p;     //输出 0x7ff7bfefef38

cout<<*p;   //输出 10

动态分配

int* p = new int;   //动态分配

*p = 10;

delete p;   //释放空间

int* a = new int[5];   //动态分配数组

delete[] a;   //释放数组

Student* p = new Student;   //动态分配结构体

p->age = 18;   //指针访问结构体属性用 ->

* 访问数组

int a[5]={1,2,3,4,5};

int* p = a;

cout<<p;   //输出 0x7ff7bfefef20

cout<<*p;   //输出 1

cout<<*(p+1);   //输出 2

math 头文件

头文件

#include<cmath>

开平方  sqrt

int n = 9;

int s = sqrt(n);   //s=3;

向下取整 floor

返回值是 double 类型

n次方 pow(int num ,int power)

int n = 2;

int square = pow(n,2);    //平方

int cube = pow(n,3);     //立方

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值