【C++】基础:STL容器库

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍STL容器库。
学其所用,用其所学。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞

文章目录

    • :smirk:1. STL容器库介绍
    • :blush:2. 序列容器
      • array静态连续数组
      • vector动态连续数组
      • deque双端队列
      • forward_list单向链表
      • list双向链表
    • :satisfied:3. 关联容器
      • set集合
      • map键值对集合
    • :satisfied:4. 容器适配器
      • stack栈
      • queue队列
      • priority_queue优先队列

😏1. STL容器库介绍

STL 容器库是 STL 的一个重要组成部分,提供了多种数据结构,包括序列容器、关联容器和容器适配器等,用于存储和管理数据。容器管理着为其元素分配的存储空间,并提供成员函数来直接访问或通过迭代器(具有类似于指针的属性的对象)访问它们。

😊2. 序列容器

array静态连续数组

#include <iostream>
#include <array>

using namespace std;

int main() {
    // 静态连续数组
    array<int, 5> a = {1, 2, 3, 4, 5};
    cout << a[0] << endl;
    cout << a.at(1) << endl; // error:at(20)

    // 初始化数组
    array<int, 10> a1;
    a1.fill(10);
    for (auto &n : a1)
    {
        cout << n << endl;
    }

    // 使用迭代器遍历
    array<int, 10>::iterator it = a1.begin(); // auto it
    for (; it != a1.end(); it++)
    {
        cout << *it << endl;
    }

    // array也可创建自定义数据类型

    return 0;
}

vector动态连续数组

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> vec(3, 100);
    vec.reserve(6); // 预留5个位置
    vec.push_back(10);
    cout << (uintptr_t)vec.data() << endl;
    vec.push_back(110); // insert
    cout << (uintptr_t)vec.data() << endl;

    vec.emplace_back(120); // emplace原位构造,复杂数据
    cout << (uintptr_t)vec.data() << endl;

    cout << vec.size() << endl;
    cout << vec.capacity() << endl;

    for (auto &n : vec)
    {
        cout << n << "\t";
    }

    return 0;
}

deque双端队列

在队列两端都可以进行操作,也可以进行随机下标访问。其操作基本上与std::vector一样,比std::vector多了在头部进行插入和移除的操作。

一般来说,std::vector用在需要频繁进行随机下标访问的场景,如果需要频繁在头部和尾部进行插入和删除操作,则用std::deque。

forward_list单向链表

单向链表迭代器只能做自增,不能与数字相加减,也不能两个迭代器相减。

#include <iostream>
#include <forward_list>

using namespace std;

// 一个元素返回true时移除对应元素
bool pre(const int &val)
{
    return val > 3; // 移除大于3的元素
}

int main() {
    forward_list<int> fls = {5, 6, 2, 3, 1};
    forward_list<int> fls2 = {0, 4, 17, 12, 15,18};

    // 升序排序/降序排序
    fls.sort(); // fls.reverse();
    fls2.sort();

    // 移除元素
    fls.remove(3);
    fls.remove_if(pre);
    // 也可以用lambda表达式
    fls.remove_if([](const int &val) { return val > 3; });

    // 合并
    fls2.merge(fls);

    for (auto &v : fls2)
    {
        cout << v << "\t\t";
    }

    return 0;
}

list双向链表

😆3. 关联容器

set集合

map键值对集合

😆4. 容器适配器

stack栈

后进先出数据结构。

#include <iostream>
#include <stack>
#include <string>

using namespace std;

int main()
{
    stack<string> str_stack;

    // 入栈, 如果是复合数据结构,用emplace就地构造代替push入栈
    str_stack.push("H");
    str_stack.push("e");
    str_stack.push("l");
    str_stack.push("lo");

    // 出栈
    while(!str_stack.empty())
    {
        string str = str_stack.top(); // 先用top获取到栈顶元素
        str_stack.pop(); // 弹出栈顶元素
        cout << str << "--已出栈,感觉良好。栈里还有" << str_stack.size() << "个元素" << endl; 
    }

    return 0;
}

queue队列

先进先出数据结构。

#include <iostream>
#include <queue>

using namespace std;

int main()
{
    queue<const char *> q;

    // 入队,如果是复合数据类型,用emplace就地构造代替push入队
    q.push("he");
    q.push("ll");
    q.push("o");

    // 出队
    while (!q.empty())
    {
        const char *name = q.front(); // 先获取队首元素
        q.pop(); // 将队首元素出队
        cout << name << "已出队,感觉良好。队里还有" << q.size() << "个元素" << endl;
    }


    return 0;
}

priority_queue优先队列

可以根据优先级的高低确定出队顺序的数据结构。如果是复合数据类型,需要提供比较函数或者重载<运算符。

#include <iostream>
#include <queue>

int main() {
    // 创建一个最大堆优先队列,存储 int 类型的元素
    std::priority_queue<int> maxHeap;

    // 添加元素到优先队列中
    maxHeap.push(3);
    maxHeap.push(5);
    maxHeap.push(1);
    maxHeap.push(7);
    maxHeap.push(2);

    // 打印优先队列中的元素(不会按顺序打印)
    std::cout << "Elements in priority queue:" << std::endl;
    while (!maxHeap.empty()) {
        std::cout << maxHeap.top() << " ";
        maxHeap.pop(); // 弹出队首元素
    }
    std::cout << std::endl;

    return 0;
}

请添加图片描述

以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/489542.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue动态渲染本地路径图片不显示的解决方案,v-fro 渲染本地图片路径不显示

1、第一种解决方法 如果直接使用本地路径渲染是渲染不出来的&#xff0c;因为这种情况下渲染时会发送网络请求加你的本地地址所以渲染不出来。 这样怎么能找到路径&#xff1f;解决方案如下 // 渲染正常渲染即可 <div v-for"(item, index) in imgPath" :key&quo…

【WEEK4】 【DAY4】AJAX第一部分【中文版】

2024.3.21 Thursday 目录 8.AJAX8.1.简介8.2.伪造ajax8.2.1.新建module&#xff1a;springmvc-06-ajax8.2.2.添加web支持&#xff0c;导入pom依赖8.2.2.1.修改web.xml8.2.2.2.新建jsp文件夹 8.2.3.新建applicationContext.xml8.2.4.新建AjaxController.java8.2.5.配置Tomcat8.…

【MATLAB源码-第9期】基于matlab的DQPSK的误码率BER和误符号率SER仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 DQPSK信号的解调与2DPSK信号的解调类似&#xff0c;也有两种方法&#xff0c;分别是极性比较法和相位比较法 极性比较法。其原理方框图如下图所示。由于DQPSK信号可以看做是两路2DPSK信号的合成&#xff0c;解 调时也可以分别…

Python环境下5种TE过程(Tennessee Eastman Process)故障检测方法

田纳西-伊斯特曼过程&#xff0c;也被称作TE过程&#xff0c;主要模拟美国田纳西州一家名为伊斯曼的化工公司的化工过程。TE过程是一个高度复杂、非线性和多变量的过程&#xff0c;涉及到多个阶段和多个控制参数&#xff0c;其中某些参数会相互影响&#xff0c;因此&#xff0c…

读研究生的时候早恋被导师发现了怎么办?

研究生早恋这事&#xff0c;危险重重&#xff0c;比走钢丝还紧张&#xff0c;这根本就是走在科研生涯的悬崖边上&#xff0c;随时都有掉下去的危险。 让我们来详细分析一下为什么你应该立刻收心&#xff0c;专注于你的实验和论文&#xff0c;而不是浪费时间在所谓的“早恋”上。…

[2023] 14届

1.日期统计 题意 1.日期统计 - 蓝桥云课 (lanqiao.cn) 思路 用dfs扫 对每一个位进行限制 花了一个小时 注意把答案枚举出来 对应一下看到底对不对 code #include<iostream> #include<cstdio> #include<stack> #include<vector> #include<al…

电脑桌面记事本便签软件,记事本软件哪个好用

正在电脑前忙碌工作&#xff0c;突然想起今晚有个重要的会议&#xff0c;或者是明天有一个重要的任务需要完成&#xff0c;但是手头的工作又无法让你离开电脑&#xff0c;这时候&#xff0c;你多么希望有一个便捷的电脑桌面记事本便签软件&#xff0c;可以让你快速记录下这些重…

Python时间

UTC ~ 北京时间 【差8小时】 格式化日期时间为字符串:strftime 时间戳-1970.1.1到现在的秒数:time.time() AttributeError: partially initialized module ‘datetime’ has no attribute ‘fromtimestamp’ (most likely due to a circular import) 改正&#xff1a;文件名和…

【C++】隐藏的this指针

文章目录 1.this指针的引出2.this指针的特性 1.this指针的引出 我们通过日期类来学习this指针&#xff0c;首先我们先定义一个日期类。 class Date { public:void Display(){cout << _year << "-" << _month << "-" << _d…

1688商品API接口数据采集助力电商ERP

1688商品API接口数据采集可以帮助电商供应链ERP系统搭建&#xff0c;提供所需的商品信息和数据。 通过使用1688商品API接口&#xff0c;可以直接从1688网站上抓取商品信息&#xff0c;包括商品名称、价格、库存、属性等。这样&#xff0c;可以省去手动复制粘贴的步骤&#xff…

矩阵的归一化技术

矩阵的归一化&#xff08;Normalization&#xff09;是将矩阵中的元素缩放到一个特定的范围或者标准&#xff0c;使得在进行比较、评估或计算时能够保持数值稳定性和可比性。这个过程在数据预处理、机器学习、图像处理等领域中非常重要。归一化有助于改善算法的收敛速度和精度&…

elasticsearch 教程(一)程序建立索引

elasticsearch 教程&#xff08;一&#xff09;程序建立索引 从elasticsearch 8.x开始&#xff0c;除了通过kibana建立索引之外&#xff0c;还可以在Java程序定义索引。待程序运行时&#xff0c;会先检测是否建立索引&#xff0c;如果已建立索引&#xff0c;即使程序中定义的索…

百能云板开启1-6层陶瓷pcb板定制服务

普通PCB通常是由铜箔和基板粘合而成&#xff0c;而基板材质大多数为玻璃纤维&#xff08;FR-4&#xff09;&#xff0c;酚醛树脂&#xff08;FR-3&#xff09;等材质&#xff0c;粘合剂通常是酚醛、环氧等。在PCB加工过程中由于热应力、化学因素、生产工艺不当等原因&#xff0…

哈希冲突解决的几种方式

目录 哈希冲突 哈希冲突-避免方式1-哈希函数的设计 1. 直接定制法--(常用) 2. 除留余数法--(常用) 3. 平方取中法--(了解) 哈希冲突-避免方式2-负载因子调节 哈希冲突-解决方式1-闭散列 1.线性探测 2.二次探测 哈希冲突-解决方式2-开散列(哈希桶) 哈希冲突 在上文中…

【Java程序设计】【C00383】基于(JavaWeb)Springboot的水产养殖系统(有论文)

【C00383】基于&#xff08;JavaWeb&#xff09;Springboot的水产养殖系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&#xff0c…

SketchUp草图大师模型网:哪家更值得信赖?

草图大师模型网是一个提供模型下载和分享的平台&#xff0c;用户可以在上面找到大量的SU模型&#xff0c;并学习一些草图大师的使用技巧。那么&#xff0c;SketchUp草图大师模型网哪家更值得信赖呢?下面将从多个角度进行比较和分析。 首先&#xff0c;我们要看看草图大师模型网…

python关于字符串基础学习

字符串 python字符串是不可改变的 Python不支持单字符类型&#xff0c;单字符也是作为一个字符串使用的。 字符串编码 python3直接支持Unicode,可以表示世界上任何书面语言的字符 python3的字符默认就是16位Unicode编码&#xff0c;ASCII是Unicode的子集 使用内置函数 ord()…

2.4 如何运行Python程序

如何运行Python程序&#xff1f; Python是一种解释型的脚本编程语言&#xff0c;这样的编程语言一般支持两种代码运行方式&#xff1a; 1) 交互式编程 在命令行窗口中直接输入代码&#xff0c;按下回车键就可以运行代码&#xff0c;并立即看到输出结果&#xff1b;执行完一行…

c++初步

作业&#xff1a; 定义自己的命名空间&#xff0c;其中有string类型的变量&#xff0c;再定义两个函数&#xff0c;一个函数完成字符串的输入&#xff0c;一个函数完成求字符串长度&#xff0c;再定义一个全局函数完成对该字符串的反转 #include <iostream> #include &…

虚拟 DOM 的优缺点有哪些

虚拟DOM&#xff08;Virtual DOM&#xff09;技术作为现代前端开发中的重要组成部分&#xff0c;已经成为了众多流行前端框架的核心特性。它的引入为前端开发带来了诸多优势&#xff0c;同时也需要我们认真思考其潜在的考量。下面简单的介绍一下虚拟DOM技术的优势与缺点&#x…