C++ STL 概念1(未完成)

STL,全称Standard Template Library(标准模板库),是C++标准库的重要组成部分。

说到C++的STL,让人就不免想到六大组件:

容器

迭代器

算法

仿函数

空间配置器

适配器

从容器开始逐个描述。

容器

容器分为关联式容器序列式容器

关联式容器

关联式容器使用键来唯一标识元素。

包括set、map、unordered_set、unordered_map。

而这四个又有各自的multi版本,就是允许键值冗余。

set/map

需要熟练掌握基本的方法,增删改查:

 1.insert

set和map的insert都重载了三种方法:单个元素插入,迭代器位置插入,迭代器范围插入

single element (1)
pair<iterator,bool> insert (const value_type& val);
with hint (2)
iterator insert (iterator position, const value_type& val);
range (3)
template <class InputIterator>void insert (InputIterator first, InputIterator last); 
第一种   insert使用set/map的元素类型插入,返回值为一个pair类型,pair的元素为迭代器和bool值
第二种   insert使用迭代器的位置插入  应用场景是先通过迭代器寻找指定元素,找不到时,pair的返回值元素中的bool是false,这时可以在迭代器的位置插入指定元素
第三种   范围插入,从另一个set/map容器中用迭代器选定一个范围,通过插入进新的set/map
 2.find
const_iterator find (const value_type& val) const;
iterator       find (const value_type& val);

参数是指定元素,返回值是迭代器

3.erase
(1)
iterator  erase (const_iterator position);
(2)
size_type erase (const value_type& val);
(3)
iterator  erase (const_iterator first, const_iterator last);
第一种 是迭代器位置删除,一般需要先将迭代器初始化为需要删除的元素节点,然后直接传入迭代器就可删除( 迭代器会失效,想继续使用这个迭代器需要用返回值更新迭代器)
第二种 是删除指定元素 ,并返回删除元素的数量
第三种 是范围删除,给定一个迭代器的范围,再给特定的一个条件去删除迭代器所指向元素,不过要 注意迭代器失效,要用返回值更新迭代器,才能在接下来的遍历过程中防止迭代器失效
map:    operator[]
mapped_type& operator[] (const key_type& k);

 operator[]是map独特的一种[ ]重载,参数是键值key,

返回值是map存储的键值对中的 值的引用(mapped_type&)

operator[ ]的用法:

一、可以用来查找[key]位置的值

二、如果[key]为空,可以用来插入新的键值对

三、如果[key]已经存在,可以修改值

iterator

要谈论set和map的迭代器,就必须要先谈它们的底层结构:红黑树

简单看一下红黑树中iterator的定义(自实现):

//红黑树迭代器类

template<class T, class Ref, class Ptr>
struct __RBTreeIterator
{
    typedef RBTreeNode<T> Node;
    typedef __RBTreeIterator<T, Ref, Ptr> Self;
    Node* _node;

    __RBTreeIterator(Node* node)
        :_node(node)
    {}
    __RBTreeIterator(const __RBTreeIterator<T, T&, T*>& it)
        :_node(it._node)
    {}

    Ref operator*()
    {
        return _node->_data;
    }

    Ptr operator->()
    {
        return &_node->_data;
    }

    bool operator!=(const Self& it)
    {
        return _node != it._node;
    }

    Self& operator++()
    {
        // 1、右不为空,下一个就是右子树的最左节点
        if (_node->_right)
        {
            Node* subleft = _node->_right;
            while (subleft->_left)
            {
                subleft = subleft->_left;
            }
            _node = subleft;
        }
        else// 2、右为空,沿着到根的路径,找孩子是父亲左的那个祖先
        {
            Node* cur = _node;
            Node* parent = _node->_parent;
            while (parent && cur == parent->_right)
            {
                cur = parent;
                parent = parent->_parent;
            }

            _node = parent;
        }

        return *this;
    }

    Self& operator--()
    {
        if (_node->_left)
        {
            // 1、左不为空,找左子树最右节点
            Node* subRight = _node->_left;
            while (subRight->_right)
            {
                subRight = subRight->_right;
            }

            _node = subRight;
        }
        else
        {
            // 2、左为空,孩子是父亲的右的那个祖先
            Node* cur = _node;
            Node* parent = cur->_parent;
            while (parent && cur == parent->_left)
            {
                cur = parent;
                parent = parent->_parent;
            }

            _node = parent;
        }

        return *this;
    }
};
 

//红黑树类

template<class K, class T, class KofT>

class RBTree

{

        typedef __RBTreeIterator<T, T&, T*> iterator;
        typedef __RBTreeIterator<T, const T&, const T*> const_iterator;

        /*......*/ 

};
 

set::iterator

set底层封装了RBTree的结构,这是set的iterator 定义(自实现): 

template<class K>
class set

{

        typedef typename RBTree<K, K, SetKeyOfT>::const_iterator iterator;
        typedef typename RBTree<K, K, SetKeyOfT>::const_iterator const_iterator;

        // .........................................................................///

};
 

直接封装RBTree就可。

这里要提一下set::iterator模版的第三个参数:SetKeyOfT

主要是为了让set能够和map共用一个底层红黑树而做的一步,SetKeyOfT本质是一个仿函数:

struct SetKeyOfT
{
    const K& operator()(const K& key)
    {
        return key;
    }
};

值得注意的是: 仿函数返回的值是const key&

这说明迭代器再返回key时,不管是const类型还是 非const类型,都会返回const的类型

map::iterator

和set一样封装了BRTree,直接看map中的定义(自实现):

template<class K, class V>
class map

{

        typedef typename RBTree<K, pair<const K, V>, MapKeyofT>::iterator iterator;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Bert 在 OCNLI 训练微调

目录 0 资料1 预训练权重2 wandb3 Bert-OCNLI3.1 目录结构3.2 导入的库3.3 数据集自然语言推断数据集路径读取数据集数据集样例展示数据集类别统计数据集类加载数据 3.4 Bert3.4 训练 4 训练微调结果3k10k50k 0 资料 【数据集微调】 阿里天池比赛 微调BERT的数据集&#xff0…

想学PR的有福了,一小时学会PR剪视频

想学PR的有福了&#xff0c;一小时学会PR剪视频 Pr是什么软件&#xff1f;教程介绍及教程展示教程领取结语下期更新预报 Pr是什么软件&#xff1f; Pr是指Adobe Premiere Pro&#xff0c;它是由Adobe公司开发的一款专业级的视频编辑软件。这款软件广泛应用于电影、电视和网页视…

SQL统计语句记录

1.达梦数据库 统计指定单位的12个月份的业务数据 SELECT a.DEPT_ID, b.dept_name, a.USER_NAME, count(a.dept_id) as count, sum(case when to_char(a.CREATE_TIME,yyyy-mm) 2023-01 THEN 1 else 0 end) as one,sum(case when to_char(a.CREATE_TIME,yyyy-mm) 2023-02 T…

【JavaEE 初阶(四)】多线程进阶

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多线程知识 目录 1.前言2.常见的锁策略2.1悲观锁vs乐观锁2.2轻量级锁vs重量级锁2.3自旋锁vs挂起锁2.4读写…

Linux——DNS域名解析服务的部署及优化方案

1. (问答题) 1.配置2台服务器要求如下&#xff1a; a&#xff09;服务器1&#xff1a; 主机名&#xff1a;dns-master.timinglee.org [rootserver100 ~]# hostnamectl hostname dns-master.timinglee.org [rootserver100 ~]# hostname dns-master.timinglee.org ip地址&#…

【数据结构(邓俊辉)学习笔记】栈与队列01——栈应用(栈混洗、前缀后缀表达式、括号匹配)

文章目录 0. 概述1. 操作与接口2. 操作实例3. 实现4. 栈与递归5. 应用5.1 逆序输出5.1.1 进制转换5.1.1.1 思路5.1.1.2 算法实现 5.2 递归嵌套5.2.1 栈混洗5.2.1.1 混洗5.2.1.2 计数5.2.1.3 甄别 5.2.2 括号匹配5.2.2.1 构思5.2.2.2 实现5.2.2.3 实例 5.3 延迟缓冲5.3.1 中缀表…

linux状态中的T(停止状态)和S(浅度睡眠状态)有什么区别?

前言&#xff1a; 最近学习Linux的七大状态。在学习这个T停止状态和S睡眠状态时觉得有些相似&#xff0c;所以这篇博客就探求一下他们之间的区别。 T停止状态 当一个进程处于T状态时&#xff0c;它已经被停止执行。这通常是通过向进程发送SIGSTOP信号来实现的。在T状态下&…

(✌)粤嵌—2024/5/9—寻找两个正序数组的中位数

代码实现&#xff1a; int binary_search(int *arr, int n, int key) {int head 0, tail n - 1, mid;while (head < tail) {mid (head tail) / 2;if (arr[mid] key) {return mid;}if (arr[mid] > key) {tail mid - 1;} else {head mid 1;}}return head; }void in…

JetBrains的Java集成开发环境IntelliJ 2024.1版本在Windows/Linux系统的下载与安装配置

目录 前言一、IntelliJ在Windows安装二、IntelliJ在Linux安装三、Windows下使用配置四、Linux下使用配置总结 前言 ​ “ IntelliJ IDEA Ultimate是一款功能强大的Java集成开发环境&#xff08;IDE&#xff09;。它提供了丰富的功能和工具&#xff0c;可以帮助开发人员更高效地…

1067 试密码(测试点2测试点5)

solution 测试点2,5 : The test may have space,so you should use getline() function but not cin() function #include<iostream> #include<string> using namespace std; int main(){string ans, test;int n, cnt 0;cin >> ans >> n;getchar();…

基于 C# 开源的 EF Core 查询计划可视化神器

介绍 EFCore.Visualizer 是 Entity Framework Core 查询计划调试器&#xff0c;一个开源的 EF Core 查询计划可视化工具, 您可以直接在 Visual Studio 中查看查询的查询计划&#xff0c;开箱即用&#xff0c;非常方便。目前&#xff0c;可视化工具支持 SQL Server 和 PostgreS…

java后端15问!

前言 最近一位粉丝去面试一个中厂&#xff0c;Java后端。他说&#xff0c;好几道题答不上来&#xff0c;于是我帮忙整理了一波答案 G1收集器JVM内存划分对象进入老年代标志你在项目中用到的是哪种收集器&#xff0c;怎么调优的new对象的内存分布局部变量的内存分布Synchroniz…

笨方法学习python(七)

输入 一般软件做的事情主要就是下面几条&#xff1a; 接受人的输入。改变输入。打印出改变了的输入。 前面几节都是print输出&#xff0c;这节了解一下输入input&#xff1b;在python2中使用的是raw_input&#xff0c;python3就只是input。 print ("How old are you?&…

springboot如何查看版本号之间的相互依赖

第一种&#xff1a; 查看本地项目maven的依赖&#xff1a; ctrl鼠标左键&#xff1a;按下去可以进入maven的下一层&#xff1a; ctrl鼠标左键&#xff1a;按下去可以进入maven的再下一层&#xff1a; 就可以查看springboot的一些依赖版本号了&#xff1b; 第二种&#xff1a; 还…

第十一章数据仓库和商务智能

单选题 (每题1分,共26道题) 1、 [单选] 数据仓库建设的主要驱动力 A:整合数据、减少冗余和提高信息一致性 B:运营支持职能、合规需求和商务智能活动 C:数据集成、分析应用和决策支持 D:客户和消费者的剧增、分析的需求、企业统一管控的需求 正确答案:B 你的答案:B 解…

RuoYi-Vue-Plus (Echarts 图表)

一、echarts 图表介绍和使用 官网地址:目前echarts以及贡献给Apache Apache EChartshttps://echarts.apache.org/zh/index.htmlecharts配置项手册 Documentation - Apache EChartshttps://echarts.apache.org/z

【快捷部署】022_ZooKeeper(3.5.8)

&#x1f4e3;【快捷部署系列】022期信息 编号选型版本操作系统部署形式部署模式复检时间022ZooKeeper3.5.8Ubuntu 20.04tar包单机2024-05-07 一、快捷部署 #!/bin/bash ################################################################################# # 作者&#xff…

宏的优缺点?C++有哪些技术替代宏?(const)权限的平移、缩小

宏的优缺点&#xff1f; 优点&#xff1a; 1.增强代码的复用性。【减少冗余代码】 2.提高性能&#xff0c;提升代码运行效率。 缺点&#xff1a; 1.不方便调试宏。&#xff08;因为预编译阶段进行了替换&#xff09; 2.导致代码可读性差&#xff0c;可维护性差&#xff0…

《CKA/CKAD应试指南/从docker到kubernetes 完全攻略》学习笔记 第14章 包管理helm v3

前言 考试大纲: 了解helm是如何工作的,从而实现快速部署应用 本章要点: 考点1:添加helm源 考点2:使用helm 部署应用 前面在使用wordpress + mysql 部署博客应用的时候,需要做许多工作,需要每个pod创建pv和pvc,然后分别创建每个应用pod及svc,整个过程非常麻烦. 如果搭建博客的…

OpenSSL实现AES的ECB和CBC加解密,可一次性加解密任意长度的明文字符串或字节流(QT C++环境)

本篇博文讲述如何在Qt C的环境中使用OpenSSL实现AES-ECB/CBC-Pkcs7加/解密&#xff0c;可以一次性加解密一个任意长度的明文字符串或者字节流&#xff0c;但不适合分段读取加解密的&#xff08;例如&#xff0c;一个4GB的大型文件需要加解密&#xff0c;要分段读取&#xff0c;…