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.mfbz.cn/a/610884.html

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

相关文章

自动化中遇到的问题归纳总结

1、动态元素定位不到 解决方法&#xff1a;尽量使用固定元素定位&#xff0c;如没有固定元素&#xff0c;则采用绝对路径进行定位&#xff0c;因为元素路径是唯一且不变的 2、自动化脚本执行速度较慢 尽量使用css方法定位元素&#xff0c;使用等待时&#xff0c;少用sleep方…

【双碳系列】碳中和、碳排放、温室气体、弹手指、碳储量、碳循环及leap、cge、dice、openLCA模型

气候变化是当前人类生存和发展所面临的共同挑战&#xff0c;受到世界各国人民和政府的高度关注 ①“双碳”目标下资源环境中的可计算一般均衡&#xff08;CGE&#xff09;模型实践技术应用 可计算一般均衡模型&#xff08;CGE模型&#xff09;由于其能够模拟宏观经济系统运行…

【机器学习】逻辑化讲清PCA主成分分析

碎碎念&#xff1a;小编去年数学建模比赛的时候真的理解不了主成分分析中的“主成分”的概念&#xff01;&#xff01;但是&#xff0c;时隔两年&#xff0c;在机器学习领域我又行了&#xff0c;终于搞明白了&#xff01;且看正文&#xff01;再分享一个今天听到的播客中非常触…

【网络安全入门】新手如何参加护网行动?一篇带你零基础入门到精通

前言 “没有网络安全就没有国家安全”。 当前&#xff0c;网络安全已被提升到国家战略的高度&#xff0c;成为影响国家安全、社会稳定至关重要的因素之一。 一、网络安全行业特点 行业发展空间大&#xff0c;岗位非常多 网络安全行业产业以来&#xff0c;随即新增加了几十个…

LaTeX公式学习笔记

\sqrt[3]{100} \frac{2}{3} \sum_{i0}^{n} x^{3} \log_{a}{b} \vec{a} \bar{a} \lim_{x \to \infty} \Delta A B C

自动驾驶系统中的端到端学习

资料下载-《自动驾驶系统中的端到端学习&#xff08;2020&#xff09;》https://mp.weixin.qq.com/s/ttNpsn7qyVWvDMZzluU_pA 近年来&#xff0c;卷积神经网络显著提高了视觉感知能力。实现这一成功的两个主要因素是将简单的模块组合成复杂的网络和端到端的优化。然而&#xf…

哪里有高清视频素材软件?哪里有视频素材网站?

在这个视觉内容至关重要的时代&#xff0c;高质量的视频素材不仅能够增强信息传递的效果&#xff0c;还能显著提升观众的观看体验。接下来介绍的这些视频素材网站&#xff0c;将为您的创作提供广泛的选择&#xff0c;从本土到国际&#xff0c;满足您不同的需求和偏好。 1. 蛙学…

ICode国际青少年编程竞赛- Python-2级训练场-识别循环规律2

ICode国际青少年编程竞赛- Python-2级训练场-识别循环规律2 1、 for i in range(3):Dev.step(3)Dev.turnRight()Dev.step(4)Dev.turnLeft()2、 for i in range(3):Spaceship.step(3)Spaceship.turnRight()Spaceship.step(1)3、 Dev.turnLeft() Dev.step(Dev.x - Item[1].…

CrossManager软件安装

目录 一、CrossManager软件 1.1 下载安装程序&#xff1a; 1.2 注册-登录 1.3 运行安装程序 1.4 完成安装&#xff1a; 1.5 激活软件&#xff1a; 文章底部可获取安装包---CrossManager软件安装&#xff08;有效期30天&#xff09; 当涉及到专业的软件安装和配置时&…

Java Web 学习笔记(一) —— MySQL(3)

目录 1 Mysql 函数1.1 日期函数1.2 判断函数1.3 字符函数1.4 数学函数 2 Mysql 性能2.1 提高操作数据库性能2.2 执行次数比较多的语句2.3 sql语句的执行效率 3 Mysql 优化&#xff08;***&#xff09;3.1 定位慢查询3.2 SQL执行计划3.3 索引3.3.1 索引介绍与分类3.3.2 索引的使…

Python 3 中zip()函数的用法

1 创作灵感 我们在阅读代码的时候&#xff0c;经常会看到zip函数&#xff0c;有的时候还和循环在一起用&#xff0c;今天举几个例子测试一下该函数的用法 2.应用举例 &#xff08;1&#xff09;定义了两个列表一个是num,一个是letter (2)使用zip可以把num列表和letter列表中…

大模型微调之 在亚马逊AWS上实战LlaMA案例(七)

大模型微调之 在亚马逊AWS上实战LlaMA案例&#xff08;七&#xff09; 微调SageMaker JumpStart上的LLaMA 2模型 这是在us-west-2的测试结果。 展示了如何使用SageMaker Python SDK部署预训练的Llama 2模型&#xff0c;并将其微调到你的数据集&#xff0c;用于领域适应或指令…

numpy1

注意&#xff1a;reshape函数的 - 1&#xff08;是让电脑 自己计算的意思 import numpy as np n np.arange(0,25).reshape(5,5) m np.array([0,5,10,15,20])nn np.repeat(n,2,axis 1) m m.reshape(-1,1)nn[:,1:8:2] np.tile(m,(1,4)) nn[:,0:-1]

无人机+光电吊舱:四光(可见光+红外热成像+广角+激光测距)吊舱设计技术详解

无人机与光电吊舱的结合&#xff0c;特别是四光吊舱&#xff08;包含可见光、红外热成像、广角和激光测距技术&#xff09;的应用&#xff0c;为无人机提供了强大的侦察和测量能力。以下是对四光吊舱设计技术的详解&#xff1a; 1. 可见光技术&#xff1a;可见光相机是吊舱中最…

螺栓扭矩如何设计?——SunTorque智能扭矩系统

螺栓扭矩设计的大小是一个涉及工程实践的重要问题&#xff0c;它直接关系到螺栓连接的紧固质量和安全性。螺栓扭矩是工程领域中常用的一个概念&#xff0c;用来描述螺栓在连接过程中所需的旋转力矩。正确的螺栓扭矩可以确保螺栓和螺母之间的紧密连接&#xff0c;避免由于松动而…

Java入门基础学习笔记10——变量

变量的学习路径&#xff1a; 认识变量->为什么要用变量&#xff1f;->变量有啥特点&#xff1f;->变量有啥应用场景&#xff1f; 什么是变量&#xff1f; 变量是用来记住程序要处理的数据的。 变量的定义格式&#xff1a; 数据类型 变量名称 数据&#xff1b; 数…

C语言/数据结构——(用双链表实现数据的增删查改)

一.前言 嗨嗨嗨&#xff0c;大家好久不见&#xff01;前面我们已经通过数组实现数据的增删查改、单链表实现数据的增删查改&#xff0c;现在让我们尝试一下使用双链表实现数据的增删查改吧&#xff01; 二.正文 如同往常一样&#xff0c;对于稍微大点的项目来说&#xff0c;…

2024洗地机选购指南 | 怎么选洗地机不会被坑?

家里的地板总是需要打扫&#xff0c;但工作忙碌的我们往往没有足够的时间来打理。洗地机不仅能够帮助我们节省宝贵的时间&#xff0c;还能让我们的家变得一尘不染。今天&#xff0c;笔者将为大家讲讲挑选洗地机的技巧&#xff0c;告诉大家怎么挑选洗地机不会被坑&#xff0c;顺…

解锁楼宇自动化新维度西门子Insight+BACnet IP I/O控制器

数字城市的楼宇自动化已不再是一个遥不可及的概念&#xff0c;而是成为了现代建筑的标配。特别是在大型商业综合体、高端写字楼和公共设施中&#xff0c;高效的楼宇管理系统是确保环境舒适度与能源效率的关键。当提及楼宇自动化领域的佼佼者&#xff0c;西门子Insight楼宇自动化…

【洛谷】动态规划之最长公共子序列

前言&#xff1a; 本系列目的是记录日常所刷的题&#xff0c;有的是自己想出来的题&#xff0c;有的是看了大佬题解后想明白的题 题目 P1439 【模板】最长公共子序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 前提&#xff1a; 两个排列都是1到n的排列&#xff0c;说…
最新文章