C++高级之SLT中的容器学习与函数谓词

vector向量学习

cpp 复制代码
// Java的集合框架 非常强大  相当于  C++  STL(标准模板库) #include <iostream>

// TODO STL 是"Standard Template Library"的缩写,中文译为"标准模板库"。STL 是 C++ 标准库的一部分,不用单独安装。

// STL 有很多很多的容器
// C++ STL 设计思路 和 Java不同

// C ++ vector 向量 容器 (内部:封装动态大小数组作为容器,能够存放任意的动态数组【数据结构】)

#include <iostream>

#include <vector> // 引入 vector 容器的支持

// NDK 开发 一定要用容器  应该 queue 队列

using namespace std;

int main() {
    std::cout << "标准模板库" << std::endl;

    vector<int> vector1;

    vector<int> vector2(10); // 指定10的空间大小

    vector<int> vector3(10, 0); // 有了10个值了 每个值都是0

    vector<int> vector4;

    // vector4.begin() 迭代器 插入到前面
    // vector4.end() 迭代器 插入到后面

    // 插入数据
    vector4.insert(vector4.begin(), 40);
    vector4.insert(vector4.begin(), 60);
    vector4.insert(vector4.begin(), 80);
    vector4.insert(vector4.begin(), 100);
    vector4.insert(vector4.begin(), 200);

    // 第一个
    cout << " 修改前:vector4.front():" << vector4.front() << endl;
    vector4.front() = 99; // 默认修改第一个
    cout << " 修改后:vector4.front():" << vector4.front() << endl;

    // 最后一个
    cout << " 修改前:vector4.back():" << vector4.back() << endl;
    vector4.back() = 777; // 默认修改最后
    cout << " 修改后:vector4.back():" << vector4.back() << endl;

    vector4.erase(vector4.begin()); // 移除第一个元素(内部:通过迭代器的位置 进行移除)  删除

    // 循环打印,默认 从大到小输出
    for (int i = 0; i < vector4.size(); ++i) {
        cout << "item:" << vector4[i] << endl;
    }

    // KT的类型推到  相当于 C++ auto
    /*var a = 10;
    var b = 30.4f;
    var c = "";*/

    // 迭代器 循环遍历
    // auto Kotlin自带类型推到
    // for (vector<int>::iterator iteratorVar = vector4.begin(); iteratorVar != vector4.end(); iteratorVar++) {
    for (auto iteratorVar = vector4.begin(); iteratorVar != vector4.end(); iteratorVar++) {
        // 迭代器 当中指针操作  iteratorVar++
        cout << "迭代器:" << *iteratorVar << endl;
    }

    cout << "" << endl;

    return 0;
}

stack栈学习

cpp 复制代码
// 2.stack栈学习。 先进后出,后进先出,手枪子弹上膛的一个思路。

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

// NDK开发者 几乎用不到

int main() {
    stack<int> stackVar;

    // 压栈(注意:stack无法指定那个位置去压栈)
    stackVar.push(30);
    stackVar.push(60);
    stackVar.push(90);

    // 请问那个元素,在最上面(看图)

    // [] 角标是不行的,内部没有重载此运算符
    /*for (int i = 0; i < stackVar.size(); ++i) {
        // cout << stackVar[i] << endl;
        // cout << stackVar.at() << endl;
    }*/

    // 他根本就没有迭代器
    // 开发者 自己组装 迭代器 遍历
    /*for (stack<int>::iterator; i < ; ++i) {

    }*/

    // 慎用,为什么? 元素被弹完了
    // 这种方式是可以的,手枪把子弹全部打完【会把元素清空】
    while (!stackVar.empty()) {
        int top = stackVar.top(); // top == 获取栈顶的元素
        cout << "获取栈顶的元素:" << top << endl; // 永远拿 90

        stackVar.pop(); // 把栈顶的元素 弹出去  【删除】
    }

    /*int top = stackVar.top();
    cout << top << endl;*/

    return 0;
}

queue队列学习

cpp 复制代码
// 3.queue队列学习(必须会使用)。

#include <iostream>
#include <queue> // 队列支持(内部:基本上 链表 、 数组 )

// 容器 + 数据结构

// 音视频: 压缩格式音频数据(push) 保存       pop消费最前面的 音频格式数据 获取

using namespace std;

int main() {
    queue<int> queueVar;

    queueVar.push(20);
    queueVar.push(40);
    queueVar.push(60);

    // 第一个元素是谁 20  FIFO 原则
    cout << " 修改前: queueVar.front():" << queueVar.front() << endl;
    queueVar.front() = 88;
    cout << " 修改后: queueVar.front():" << queueVar.front() << endl;

    // 最后一个
    cout << " 修改前: queueVar.back():" << queueVar.back() << endl;
    queueVar.back() = 88;
    cout << " 修改后: queueVar.back():" << queueVar.back() << endl;

    // 没有找到 角标
    /*for (int i = 0; i < 9; ++i) {
        queueVar[i];
    }*/

    // 他根本就没有迭代器
    /*for (queue<int>::iterator; i < ; ++i) {

    }*/

    // 慎用,为什么? 前面的元素全部被消费完了
    while (!queueVar.empty()) {
        cout << "while1:" << queueVar.front() << endl;

        queueVar.pop(); // 把前面的元素 给消费掉  【删除】
    }

    while (!queueVar.empty()) {
        cout << "while2:" << queueVar.front() << endl;

        queueVar.pop(); // 把前面的元素 给消费掉  【删除】
    }

    return 0;
}

优先级队列学习

cpp 复制代码
// 4.优先级队列学习 (queue 的 子集)。

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

// priority_queue 内部对我们前面的vector 有一定的封装

// Deque 跟 queue  有什么区别啊   双端队列

int main() {
    // 优先级队列,默认做了 从大大小 60 50 40 ...
    // priority_queue<int> priorityQueue;

    // 隐式代码: vector<int>, less<int>  你看不到
    // priority_queue<int, vector<int>, less<int>> priorityQueue;

    // less  // less<int> return __x < __y;  上一个元素和当前元素 比较,返回ture false  从大到小

    // less return __x < __y;  // 从大到小
    // greater return __x > __y; // 从小到大

    // 第二个参数:他内部需要vector,你就给他

    priority_queue<int ,vector<int>, less<int>> priorityQueue;
    // priority_queue<int ,vector<int>, greater<int>> priorityQueue;

    priorityQueue.push(10);
    priorityQueue.push(20);
    priorityQueue.push(30);
    priorityQueue.push(40);
    priorityQueue.push(50);
    priorityQueue.push(60);

    cout << priorityQueue.top() << endl; // 60

    // 循环代码
    while (!priorityQueue.empty()) {
        cout << "while1:" << priorityQueue.top() << endl; // 一直是60
        priorityQueue.pop(); // 最前面的元素消费掉
    }
    return 0;
}

list的学习

cpp 复制代码
// 5.list的学习。 Java:ArrayList采用Object[]数组,   C++的list 内部:采用链表

#include <iostream>
#include <list> // list容器的支持
using namespace std;

// NDK 基本上用不到 list

int main() {
    list<int> listVar;

    // 插入操作
    listVar.push_front(50); // 插入到前面   明确
    listVar.push_back(60); // 插入到后面
    listVar.insert(listVar.begin(), 70); // 插入到前面  灵活
    listVar.insert(listVar.end(), 80); // 插入到后面

    // 修改操作
    listVar.back() = 88;
    listVar.front() = 55;

    // 删除
    listVar.erase(listVar.begin()); // 删除最前面的 55
    listVar.erase(listVar.end()); // 删除最后面的 88

    // list 迭代器
    // 不用通过角标去访问,也不能修改   遍历
    for (list<int>::iterator it = listVar.begin(); it != listVar.end() ; it ++) {
        cout << *it << endl;
    }

    return 0;
}

set来引出函数谓词

cpp 复制代码
// 6.set容器  来引出函数谓词。

// set(内部:红黑树结构),会对你存入的数据进行排序,但是绝对不允许元素相同

#include <iostream>
#include <set>

using namespace std;


int main() {
    set<int, less<int>> setVar; //  __x < __y 从小到大,默认情况下 就是 less

    // 添加参数,不需要用迭代器,也不需要指定位置
    setVar.insert(1);
    setVar.insert(3);
    setVar.insert(2);
    setVar.insert(4);

    // 重复插入,并不会报错  std::pair<iterator, bool>
    pair<set<int, less<int>>::iterator, bool> res = setVar.insert(8);

    // res.first 获取第一个元素 迭代器   当前迭代器   最后一个位置
    // res.second 获取第二个元素 bool
    bool insert_success = res.second;
    if (insert_success) {
        cout << "恭喜你,插入成功" << endl;

        // 插入成功后,我用第一个元素遍历
        for (; res.first != setVar.end(); res.first ++) {
            cout << *res.first << endl;
        }

    } else {
        cout << "哎,插入失败.." << endl;
    }

    // 全部遍历  auto 自动推到
    for (auto it = setVar.begin(); it != setVar.end() ; it ++) {
        cout << *it << endl;
    }

    return 0;
}

谓词 设计对象的排序

cpp 复制代码
// 谓词 设计对象的排序

#include <iostream>
#include <set>

using namespace std;

// set(内部:红黑树结构),会对你存入的数据自动进行排序,但是绝对不允许元素相同

class Person {
public:
    string name;
    int id;
    Person(string name, int id) : name(name), id(id) {}
};

// C++ 都是一些常规的 谓词  不能满足功能, 模仿C++源码的谓词 自定义谓词 解决这个问题

// C++缔造者写的这个源码 没有对象比较的功能 【系统源码谓词 做不到对象比较功能】
// bool operator()(const _Tp& __x, const _Tp& __y) const { return __x < __y; }

// 我们就自定义这个功能  【自定义谓词 没有达到谓词的标准】
bool doCompareAction(const Person& person1, const Person& person2) {
    return person1.id < person2.id;
};

// 真正的谓词
struct doCompareAction2 {
public:
    bool operator() (const Person& __x, const Person& __y) {
        return __x.id < __y.id;
    }
};

struct doCompareAction3 {
public:
    bool operator() (const Person& __x, const Person& __y) {
        return __x.id > __y.id;
    }
};

int main() {
    // 默认是 less  return 对象1 < 对象2;

    set<Person, doCompareAction2> setVar;

    // set<Person, doCompareAction3> setVar;

    // 构建对象
    Person p1 ("Snake", 1);
    Person p2 ("kevin", 2);
    Person p3 ("Derry", 3);

    // 把构建的对象 插入到 set 容器里面去
    setVar.insert(p1);
    setVar.insert(p2);
    setVar.insert(p3);

    // name string  ---  c_str() ---->   char *
    for (set<Person>::iterator it = setVar.begin(); it != setVar.end() ; it ++) {
        cout << it->name.c_str() << " , " << it->id << endl;
    }

    return 0;
}
相关推荐
wjs20242 小时前
Bootstrap 下拉菜单:功能、应用与优化
开发语言
瓦特what?2 小时前
波 浪 排 序
c++·算法·排序算法
xhyu612 小时前
【学习笔记】推荐系统 (5.排序:多目标模型、MMoE、融合预估分数、视频播放建模)
笔记·学习·音视频
bepeater12342 小时前
Laravel9.X核心特性全面解析
c语言·c++·c#·php
tod1132 小时前
C++ 核心知识点全解析(七)
开发语言·c++·面试经验
悠哉悠哉愿意2 小时前
【物联网学习笔记】中断
笔记·单片机·嵌入式硬件·物联网·学习
njsgcs2 小时前
py不等于python
开发语言·python
沐知全栈开发2 小时前
Vue3 事件处理
开发语言
心愿许得无限大2 小时前
模板与泛型
c++