【笔记】C语言转C++

网课链接:【C语言 转 C++ 简单教程】 https://www.bilibili.com/video/BV1UE411j7Ti/?p=27\&share_source=copy_web\&vd_source=4abe1433c2a7ef632aeed6a3d5c0b22a

网课老师B站id:别喷我id

视频总时长:01:55:27

以下笔记是我通过此网课整理 建议先看完网课 再用这个笔记进行复习

网课老师同时整理了思维导图 可以在视频简介获取

cpp 复制代码
/*
  用C++刷算法的不同之处:
    1、兼容C语言
    2、丰富的STL库
    3、string很好用
    4、时间上要差一些
*/

#include<iostream>  // 输入输出流 input output
#include<cstring>  //即#include<string.h>
// C++中,C语言中的头文件都可以通过去掉.h,在开头加c实现
#include<string> 
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<bitset>
#include<algorithm> // sort()函数的头文件 algorithm算法
#include<cctype>
using namespace std;
// 使用名称空间 避免不同厂商使用的函数名称重复导致的误用
// 所以每家厂商将自己的函数封装在自己设定的名称空间里

 //结构体&引用&和传值
 //结构体
struct stu {
    string name;
    int age;
};
// stu a[10];  直接用stu命名变量

// 引用: 引用的时候会把初始变量也改变 约等于c语言里的指针不写*
// 传值: 传值只改变函数里的变量 不会带到函数外 

bool cmp1(int x, int y) {
    return x > y;
}
// 返回值为真 那么x放在y前面
// 返回值为假 交换两个数

bool cmp2(stu a, stu b) {
    if (a.age != b.age)
        return a.age < b.age;
    else
        return a.name < b.name;
}
// 以年龄为第一限制条件从小到大排序 
// 年龄相同就参考第二限制条件 按名字的ACSII码从小到大排序

int main()
{
    //输入输出等基本
    int n;
    cin >> n;
    // 输入cin(记in)
    cout << "wohaoshuai!" << ++n << endl; // 输出cout(记out) 换行endl("\n")
    // cin cout的运算速度会低于scanf和printf
    /*
    若没有提前使用名称空间
    也可以在main函数中调用的时候使用以下格式:
    std::cin
    std::cout
    std::endl
    */
    cout << "*******************" << endl;


    // bool和const
    for (int i = 0; i < 10; i++)
        cout << n << " ";
    // 可在循环里定义变量i
    cout << endl;

    bool flag = true;
    bool flag2 = -1;
    bool flag3 = 0;
    // bool将值判为0或1(非0即为1)
    cout << flag << " " << flag2 << " " << flag3 << endl;

    const int MAX = 150;
    // const定义的常量无法进行更改 可看做宏定义
    // MAX = 100; 此表达式会报错
    cout << MAX << endl;
    cout << "*******************" << endl;


    // 字符串
    // 定义字符串
    string s1 = "hello";
    string s2 = " world!";
    string s3 = s1 + s2;
    cout << s3 << endl;

    getline(cin, s1);
    // cin只能输入空格前的字符 getline可以输入一整行 但要声明头文件string
    cout << s1 << endl << s1.length() << endl; // 此长度不包括\0

    // 子串
    string s1_sub = s1.substr(1, 2);
    // s.substr(n1,n2)(从下标为n1的字符开始,取n2个字符)
    // s.substr(n1)(从下标为n1的字符开始取,取完)
    // 【字符串下标从0开始算】
    cout << s1_sub << endl;
    cout << "*******************" << endl;


    // STL篇
    // vector 矢量向量/动态数组/不定(可变)参数组
    vector<int>v; // 定义一个长度为0的空数组
    v.resize(10);  // v.resize(length); 重新分配数组大小
    for (int i = 0; i < 10; i++)
        v[i] = i;
    for (int i = 0; i < 10; i++)
        cout << v[i] << " ";
    v.push_back(11); // 给数组扩充一个新空间 给首个空位赋值为11
    for (int i = 0; i < 11; i++)
        cout << v[i] << " ";
    cout << endl << v.size() << endl;

    vector<int>d(10, 2); // 定义一个长度为10,每个值都为2的数组
    d.size(); //变量名.方法
    for (auto p = d.begin(); p != d.end(); p++)  // b.end()的位置是最后一个元素的后一位
        cout << *p << " ";
    // 迭代器 自动遍历一遍数组中所有的数据
    cout << "*******************" << endl;


    // set 集合 里面的元素各不相同 而且元素会按照从小到大排序
    // unordered_set 省去排序过程(无序)的集合 要用#include<unordered_set>
    // unordered_set<int>s;  这样定义 其它调用方法和set一模一样
    set<int>s;
    s.insert(1);
    s.insert(2);
    s.insert(3);
    for (auto p = s.begin(); p != s.end(); p++)
        cout << *p << ' ';
    cout << endl;
    cout << (s.find(2) != s.end()) << endl;
    // 集合中找2 找到后返回2的位置 和s.end()的位置不同即返回1 说明找到了
    cout << (s.find(4) != s.end()) << endl;
    // 集合中找4 找到后返回4的位置 和s.end()的位置相同即返回0 说明未找到
    s.erase(1);  // 删除1
    cout << (s.find(1) != s.end()) << endl;
    cout << "*******************" << endl;


    // map 键值对 自动将所有的键值对按照键(ASCII)从小到大排序
    // unordered_map 省去排序过程(无序)的键值对 要用#include<unordered_map>
    // unordered_map<int>m;  这样定义 其它调用方法和map一模一样
    map<string, int>m;
    m["hello"] = 2;
    m["world"] = 3;
    m["ilovewuhan"] = 5;
    m["ha"] = 6;
    /*
    struct{
        string key;
        int data;
    }
    */
    cout << "hello:" << m["hello"] << endl;
    for (auto p = m.begin(); p != m.end(); p++)
        cout << p->first << ":" << p->second << endl;
    // p->first为键 p->second为值
    cout << "map的长度为:" << m.size() << endl; // size容器
    cout << "*******************" << endl;


    // 栈和队列
    // stack 栈
    stack<int>sta;
    sta.push(1);
    sta.push(2);
    sta.push(3);
    sta.pop();
    sta.push(76);
    cout << sta.top() << endl;
    cout << "栈的长度为:" << sta.size() << endl;
    // 无法使用迭代器 栈只能获得栈顶元素

    // queue 队列
    queue<int>q;
    for (int i = 1; i <= 10; i++)
        q.push(i);
    q.pop();
    cout << "队首为:" << q.front() << endl << "队尾为:" << q.back() << endl;
    cout << q.size() << endl;
    cout << "*******************" << endl;


    // bitset 字符数组 从二进制的低位到高位依次为b[0]、b[1]......
    bitset<5>b(19);  // 5个二进制位 将19转化为二进制 即10011
    // bitset<5>b; 即初始化为00000
    // bitset<5>b("11"); 直接赋二进制的值 即为00011
    cout << b << endl; //直接输出这个字符
    for (int i = 0; i < b.size(); i++)
        cout << b[i] << " ";
    // 从低位到高位一个一个输出
    cout << endl;

    cout << "是否有1:" << b.any() << endl;
    cout << "是否不存在1:" << b.none() << endl;
    cout << "1的个数:" << b.count() << endl;
    cout << "b中元素个数:" << b.size() << endl;
    cout << "下标为i的元素是不是1:" << b.test(0) << endl;
    b.flip(1); // 第1位取反(是从右边开始数的第0位、第1位)
    // b.flip() 所有位取反
    b.reset(2); // 第2位归零
    // b.reset() 所有位归零
    cout << b << endl;
    unsigned long z = b.to_ulong(); // 转化为十进制
    cout << z << endl;

    string e = "0110101";
    bitset<5>c(e, 0, 5); // bitset<二进制位数>c(字符串,位置,取的位数)
    // 即bitset<5>c("01101");
    cout << "*******************" << endl;


    // sort函数 对一个数组进行排序(默认从小到大)
    // vector是容器 需要用v.begin()表示头 v.end()表示尾
    // int arr[]使用arr表示数组的首地址 arr+n表示尾部
    vector<int>g(10);
    for (int i = 9; i >= 0; i--)
        g[i] = 9 - i;
    for (int i = 0; i < 10; i++)
        cout << g[i] << " ";
    cout << endl;
    g.push_back(-1);
    sort(g.begin(), g.end()); // [ ) 左闭右开
    for (int i = 0; i < 11; i++)
        cout << g[i] << " ";
    cout << endl;

    sort(g.begin(), g.end(), cmp1); // cmp 自定义排序规则(需另外定义函数)
    for (int i = 0; i < 11; i++)
        cout << g[i] << " ";
    cout << endl;
    stu a[10];
    for (int i = 0; i < 10; i++)
        cin >> a[i].name >> a[i].age;
    sort(a, a + 10, cmp2);
    for (int i = 0; i < 10; i++)
        cout << a[i].name << " " << a[i].age << endl;
    cout << "*******************" << endl;


    // cctype头文件的函数
    char f = 'A';
    cout << "isalpha" << isalpha(f) << endl; // 字母?
    cout << "islower" << islower(f) << endl; // 小写字母?
    cout << "isupper" << isupper(f) << endl; // 大写字母?
    cout << "isalnum" << isalnum(f) << endl; // 字母or数字?
    cout << "isspace" << isspace(f) << endl; // space \t \r \n?
    char f1 = tolower(f); // 转化为小写字母
    cout << f1 << endl;
    char f2 = toupper(f); // 转化为大写字母
    cout << f2 << endl;
    cout << "*******************" << endl;


    // C++11篇
    // C++11的解释:2011年官方带来的新的语法标准 新增了很多特性   
    // dev c++使用C++11里的函数需要设置 
    // Settings->Compiler->C++11那一行勾选上->OK

    // auto声明  可以让编译器根据初始值直接推断变量的类型
    auto x = 19;
    auto y = 1.8;
    // 用auto定义的时候一定要初始化赋值
    // 迭代器用到auto(可用迭代器的有vector set map)

    // 基于范围的for循环
    int k[5] = { 1 };
    for (int i : k) // i作为参数不会带出for循环 类似于函数 除非给i改成&i取地址
        i++;
    for (int i : k)
        cout << i << " ";
    cout << endl;
    vector<int>k2(10, 1);
    for (auto i : k2) // 相当于迭代器 所有的容器都可以通过这种方式循环
        cout << i << " ";
    cout << endl;

    // to_string 将数字转化为字符变量
    string o = to_string(123.1); // 这边浮点型会自动保留到小数点后六位
    cout << o << endl;
    printf("%s\n", o.c_str()); // printf输出的形式

    // stoi和stod 将字符串转化为其它变量
    // 记忆方法:stoi (string to int)   stod (string to double) 
    // 还有stof stold stol stoll stoul stoull等一系列
    int r = stoi("123");
    cout << r << endl;
    double t = stod("12.34");
    cout << t << endl;



    return 0;
}
相关推荐
M-x_y1 小时前
排序算法--C语言
c语言·算法·排序算法·设计语言
五味香1 小时前
Java学习,字符串搜索
java·c语言·开发语言·python·学习·golang·kotlin
Jack电子实验室2 小时前
STM32 出租车计价器系统设计(一) 江科大源码改写
c语言·stm32·单片机·嵌入式硬件·嵌入式
Coding~2 小时前
逆向攻防世界CTF系列56-easy_Maze
c语言·汇编·算法·安全·网络安全
獨枭2 小时前
MFC 自定义编辑框:打造灵活的数据输入控件
c++·mfc
绿白尼2 小时前
Linux C所有预定义的宏
linux·c语言
逆袭之路6662 小时前
浅谈右值引用 移动语义 完美转发 std::move std::forward,窥探模板元编程的一角
c++
安於宿命3 小时前
【Linux】文件系统
linux·服务器·c++
狄加山6753 小时前
C语言(函数)
java·c语言·算法