首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【C++】STL 容器 - STL 容器语意 ( 容器存储任意类型元素原理 | STL 容器元素可拷贝原理 | STL 容器元素类型需要满足的要求 | 自定义可存放入 STL 容器的元素类 )

一、STL 容器 ( Value ) 语意 1、STL 容器存储任意类型元素原理 C++ 语言中的 STL 容器 , 可以存储任何类型的元素 , 是因为 STL 容器 使用了 C++ 模板技术进行实现...; C++ 模板技术 是 基于 2 次编译实现的 ; 第一次编译 , 扫描模板 , 收集有关模板实例化的信息 , 生成模板头 , 进行词法分析句法分析 ; 第二次编译 , 根据实际调用的类型 , 生成包含真实类型的实例化的代码...容器元素类型需要满足的要求 STL 容器元素类型需要满足的要求 : 提供 无参 / 有参 构造函数 : 保证可以创建元素对象 , 并存放到容器中 ; 提供 拷贝构造函数 : STL 容器的元素是可拷贝的...容器的元素类 1、代码示例 STL 容器元素类型需要满足的要求 : 提供 无参 / 有参 构造函数 : 保证可以创建元素对象 , 并存放到容器中 ; 提供 拷贝构造函数 : STL 容器的元素是可拷贝的...char* 类型指针 int 类型成员 ; 其中 char* 类型指针涉及到 堆内存 的 申请 释放 ; 在 有参构造 函数中 , 主要作用是 创建新对象 , 这里 直接 申请内存 , 并使用参数中的

8910
您找到你想要的搜索结果了吗?
是的
没有找到

STL小结

2).仿函数有类型识别,可以作为模板参数。 3).执行速度上仿函数比函数指针要更快的。 怎么使用仿函数? 除了在STL里,别的地方你很少会看到仿函数的身影。...而在STL里仿函数最常用的就是作为函数的参数,或者模板参数。...5、适配器 适配器是用来修改其他组件接口的STL组件,是带有一个参数的类模板(这个参数是操作的的数据类型)。STL定义了3种形式的适配器容器适配器,迭代器适配器,函数适配器。...例如: 在STL程序里,有的算法需要一个一元函数作参数,就可以用一个适配器把一个二元函数一个数值,绑在一起作为一个一元函数传给算法。...构造函数参数: 格式:_需要绑定类型,_参数1,_参数2,_参数3,_参数4… _需要绑定类型:可以是普通函数,类成员函数,成员变量 _参数N:可以是一个占位符,或者实际参数

81910

【笔记】C++标准库: 体系结构与内核分析(下)

其中C++算法有些会接受一个额外的函数操作作为参数, 这个函数操作是用来改变算法关键行为的, 例如原版的accumulate()中是将容器内容累加到初值上, 第二个版本变为将容器内容使用传入的操作与当前累计进行叠加计算..._copy 部分算法有 不修改原容器, 而是复制到新的容器中并返回, 需要传入指向新保存结果的容器的迭代器 适配器 适配器是为了给STL的各个组件额外的改造, 实际上就是一种包装, 适配器的思想是来自适配器设计模式的...平时常用的适配器容器适配器(stackquene就属于对deque之类的容器适配器), 迭代器适配器(通过操作符重载改变迭代器的行为例如重载加减改变迭代器方向的reverse_iterator重载赋值改变迭代器拷贝操作的...搬移构造搬移赋值函数的特征是参数带有右引用符&&而非普通的引用符&, 然后需要调用搬移函数的时候要使用std::move()函数如下: string s1(s2); // 普通拷贝构造 string...这也就是搬移函数使用右引用作为参数的原因, 因为搬移语义下, 被拷贝的原对象应该是临时的, 可被马上抛弃的对象, 也就是右对象.

76920

10.1 C++ STL 模板适配与迭代器

STL(Standard Template Library)标准模板库提供了模板适配器迭代器等重要概念,为开发者提供了高效、灵活方便的编程工具。...模板适配器是指一组模板类或函数,它们提供一种适配机制,使得现有的模板能够适应新的需求。而迭代器则是STL中的令一种重要的概念,它是一个抽象化的数据访问机制,通过迭代器可以遍历STL容器中的元素。...通过模板参数,指定第一个参数类型为int,第二个参数类型也为int,返回类型为void。在operator()中,对两个int类型参数valstart进行加法运算,并输出结果到控制台。...使用ptr_fun的一般步骤为: 在定义函数时,将函数声明为普通函数类型。 在使用ptr_fun适配器时,通过参数列表将想要转换的函数名作为参数传入ptr_fun中。...在使用not1这个适配器时,需要注意函数对象必须是一个一元谓词,也就是说,只接受一个参数并返回布尔的函数对象。适配后的新函数对象接受一个参数,它的返回取决于原函数对象的返回,并将其取反。

17410

10.1 C++ STL 模板适配与迭代器

STL(Standard Template Library)标准模板库提供了模板适配器迭代器等重要概念,为开发者提供了高效、灵活方便的编程工具。...模板适配器是指一组模板类或函数,它们提供一种适配机制,使得现有的模板能够适应新的需求。而迭代器则是STL中的令一种重要的概念,它是一个抽象化的数据访问机制,通过迭代器可以遍历STL容器中的元素。...通过模板参数,指定第一个参数类型为int,第二个参数类型也为int,返回类型为void。在operator()中,对两个int类型参数valstart进行加法运算,并输出结果到控制台。...在使用ptr_fun适配器时,通过参数列表将想要转换的函数名作为参数传入ptr_fun中。将得到的适配后的函数对象作为参数传递给调用该函数的算法函数。...在使用not1这个适配器时,需要注意函数对象必须是一个一元谓词,也就是说,只接受一个参数并返回布尔的函数对象。适配后的新函数对象接受一个参数,它的返回取决于原函数对象的返回,并将其取反。

17420

从零开始学C++之STL(一):STL六大组件简介

4、从实现层次看,整个STL是以一种类型参数化(type parameterized)的方式实现的 基于模板(template) 二、STL组件 Container(容器) 各种基本数据结构...序列式容器 序列式容器Sequence containers,其中每个元素均有固定位置——取决于插入时机地点,元素无关。...(四)、适配器 1、适配器是一种接口类 为已有的类提供新的接口 目的是简化、约束、使之安全、隐藏或者改变被修改类提供的服务集合 2、三种类型适配器容器适配器:用来扩展7种基本容器,它们和顺序容器相结合构成栈...、队列优先队列容器 迭代器适配器(反向迭代器、插入迭代器、IO流迭代器) 函数适配器(函数对象适配器、成员函数适配器、普通函数适配器) (五)、函数对象 1、函数对象(function object...当然,用户也可以定制自己的allocator,只要实现allocator模板所定义的接口方法即可,然后通过将自定义的allocator作为模板参数传递给STL容器,创建一个使用自定义allocator的

1.3K00

STL容器适配器

1.1、适配器概念 适配器(也称之为配接器adapter)作为STL的六大组件之一,在STL中同样扮演轴承、转换器的角色。...至于为何采用deque作为其底层容器,本文后面会进行讲解。 2.2.2、stack使用 在使用时,我们平常并不需要修改其底层容器,只需传一个模板参数类型即可,使用时需包含头文件。...、queue 2.3.1、queue的介绍 queue也是默认以deque作为其底层容器,我们平常在使用时,直接传一个模板参数T即可,当然我们也可以修改其底层容器,不过要作为queue的底层容器,必须要具有以下几个接口...,而deque由于其中控器中存储的都是一个个的指针,因此在扩容时,仅仅只需要将其数组指针进行拷贝,这里就不存在深拷贝的问题,因为指针是内置类型,内置类型在拷贝时是拷贝(浅),因此deque的扩容要比vector...3.2.5、为什么采用deque作为stack与queue的默认底层容器

19910

C++ STL学习之【容器适配器

最后的仿函数适配器就厉害了,几乎可以 无限制的创造出各种可能的表达式 本文介绍的是容器适配器,即 栈 队列,最后还会介绍一下常作为这两种容器适配器的默认底层容器 双端队列 出自 《STL源码剖析...{ //这里选择模板参数2 底层容器 的缺省为 vector template> class stack {...,queue 官方提供的接口也是一样的少 栈一样,队列也有两个模板参数参数1:T 队列中的元素类型,同时也是底层容器中的元素类型 参数2:Container 实现队列时用到的底层容器,这里为缺省参数...,会引发中间位置插入删除效率低的问题 对此 SGI 版的 STL 选择牺牲中间位置插入,提高下标随机访问速度,令小数组定长,这也是将它作为队列 默认底层容器的原因之一,因为 栈队列 不需要对中间进行操作...,只需要做简单了解就行了 ---- 总结 以上就是本篇关于 C++ STL学习之【容器适配器】的全部内容了,在本文中,我们首先学习了适配器默认,了解它存在的意义及种类;其次学习模拟实现了两种容器适配器

34030

C++(STL3)容器适配器(1) stack,queue and priority_queue

C++(STL3)容器适配器 容器适配器是一个封装了序列容器的类模板,它在一般序列容器的基础上提供了一些不同的功能。之所以称作适配器类,是因为它可以通过适配容器现有的接口来提供不同的功能。...第一个参数是存储对象的类型,第二个参数是底层容器类型。...,只要堆栈的底层容器类型这个容器类型相同。...swap(queue &other_q):将当前 queue 中的元素参数 queue 中的元素交换。它们需要包含相同类型的元素。也可以调用全局函数模板 swap() 来完成同样的操作。...fonction 中定义了 greater,用来作为模板的最后一个参数对元素排序,最小元素会排在队列前面。当然,如果指定模板的最巵一个参数,就必须提供另外的两个模板类型参数。 ?

64330

【c++】深入剖析与动手实践:C++中Stack与Queue的艺术

stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入弹出。...适配器让那些由于接口不兼容而不能一起工作的类可以一起工作 在容器类库设计中(如标准模板STL 中的容器),适配器模式通常用于通过已有的容器类型(如vector, deque, list等),来实现某种特定的抽象数据类型...Container: 底层容器类型,默认是 vector Container 是一个模板参数,它允许我们定义底层数据结构。...vectorlist,deque的应用并不多,而目前能看到的一个应用就是,STL用其作为stackqueue的底层数据结构 为什么选择deque作为stackqueue的底层默认容器?...但是STL中对stack queue默认选择deque作为其底层容器,主要是因为: stackqueue不需要遍历(因此stackqueue没有迭代器),只需要在固定的一端或者两端进行操作。

6110

C++实现 STL 标准库算法(一)实验楼笔记

STL 由算法,容器,迭代器,适配器,仿函数(函数对象),空间适配器六大部件组成 。我们将主要讲解容器,迭代器,算法仿函数。适配器的部分会交给学员来实现,而空间适配器不会太过于深入。...这里的容器首先是一个模板类,在类中实现对数据的操作,而包含这样的类的实现就叫一个容器。...演示一个简单的函数: add(int &a ,int &b) ,它传入两个引用,然后执行加法操作,可以看到它依赖于 int 这个特定的类型,而且暴露了这个函数的内部结构不利于对底层的隔离封装。...而为什么需要仿函数呢?因为STL没有也不可能将所有东西都包含到函数中,而程序是对现实的模拟,现实又是最复杂的,一个sort(),你要 。如何协调呢?...运用泛型,模板,oop等思想,是学习理解 c++ 这门语言的必经之路。

1.6K20

【C++】STL 标准模板库 ② ( STL 标准模板库组成 | STL 十三个头文件 | STL 六大组件 | STL 容器存放基础数据类型 | STL 容器存放类对象 | 容器存放对象指针 )

一、STL 标准模板库组成 1、STL 十三个头文件 STL 标准模板库 Standard Template Library 主要包括 容器 / 迭代器 / 算法 三大类内容 , 其中 容器 算法...: 双端队列 , 可以在 队列头部 队列尾部 进行插入删除操作 ; : 仿函数 , 本质是 函数对象 , 可以作为参数进行传递 ; : 迭代器 ,...释放 等功能 ; : 数学运算函数 , 如 : 求和 , 乘积 等运算 ; : 实用函数模板类 , 如 : 交换两个的函数 , 多重判断 等功能 ; 2、STL...迭代器 Iterator : 容器 与 算法 之间 通过 迭代器 进行关联 , 其本质 是 泛型指针 ; 仿函数 Function Object : 函数对象 , 可以作为参数进行传递 , 可以作为算法的某种策略...; 适配器 Adaptor : 用于修饰 容器 , 仿函数 , 迭代器 接口 ; 空间配制器 Allocator : 负责空间配置与管理 ; 二、代码示例 - STL 容器存放基础数据类型 代码示例

37430

【笔记】C++标准库: 体系结构与内核分析(上)

算法(algorithm): 核心, 封装各种算法 迭代器(iterator): 泛化的指针, 用来操控容器内的数据 仿函式(functor): 类似函数但又不是函数, 用来作为参数给其它算法调用 适配器...实例化模板类时必须知名模板参数类型, 因为实例化模板类对于编译器来说没有任何可供推理的线索 模板函数: 模板类相近, 在函数定义之前加template, 区别在于由于函数参数的独一性..., 使用模板参数时并不必要知名模板参数类型, 因为编译器能自动进行实参推导....但对于模板类中的模板函数, 使用时则需要提供对应模板类的模板参数, 然后函数自己的模板实参由编译器自动推导. 在类外定义的时候需要提供两个模板标识符....偏特化是介于泛化全特化之间的状态, 其只指明了模板参数列表中的某几个类型或者缩小类型本身的数据范围(任何类型(T), 仅限指针类型(T*), 仅限指向常量的指针类型(const T*)), 例如template

1.1K30

【c++】初阶模版与STL简单介绍

例如,如果你用 int 类型实例化该模板,编译器将生成一个接受 int 参数并返回 int 类型的函数,T代表类型 有了这个模板,我们不需要再写几个函数重载 template...() { if(_a) delete[] _a; _top = _capacity = 0; } 类模板中函数放在类外进行定义时,需要模板参数列表 STL 1.什么是STL?...STL容器分为序列式容器(如vector、list、deque等)关联式容器(如set、map等) 迭代器(Iterators):迭代器是一种使程序员能够遍历容器中的元素,而不需要了解容器内部实现细节的对象...适配器(Adapters):适配器可以修改容器或函数对象的接口,使其适用于不同的场合。例如,stack、queuepriority_queue是容器适配器。...分配器(Allocators):用于定义内存模型,允许STL容器管理存储空间的分配释放。 STL确实是现代C++编程的基石,它的设计哲学、灵活性以及对编程效率的提升有着深远的影响

9310

C++系列笔记(九)

标准模版库介绍 STL容器 顺序容器   顺序容器按顺序存储数据,如数组列表。顺序容器具有插入速度快但查找操作相对较慢的特征。...类似,但允许存储多个相同的项,即需要是唯一的。...容器适配器 容器适配器(Container Adapter)是顺序容器关联容器的变种,其功能有限,用于满足特定的需求。主要的适配器类如下。...STL listforward_list 标准模板库(STL)以模板类std::list的方式向程序员提供了一个双向链表。双向链表的主要优点是,插入删除元素的速度快,且时间是固定的。...注意,输入类型InputIterator是一种模板参数类型,因此可指定任何集合(数组、vector或另一个list)的边界。

1K20

初识STL

STL C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板函数,这些模板函数可以实现多种流行常用的算法和数据结构,如向量、链表、队列、栈。...STL 几乎所有的代码都采用了模板类或者模板函数,这相比传统的由函数类组成的库来说提供了更好的代码重用机会。...STL六大组件 STL大体分为六大组件,分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器。...所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针(native pointer)也是一种迭代器。 仿函数:行为类似函数,可作为算法的某种策略。...关联式容器另一个显著特点是:在中选择一个作为关键字key,这个关键字对起到索引的作用,方便查找。

9110

一文了解stackqueue类的实现

stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入弹出。...如果在priority_queue中放自定义类型的数据,用户需要在自定义类型中提供> 或者< 的重载 有些情况下,用户可能需要提供比较器规则 4....4.2 为什么将stack、queuepriority_queue称作为容器适配器 虽然stack、queue、priority_queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器...4.3 为什么选择deque作为stackqueue的底层默认容器 stack是一种后进先出的特殊线性数据结构,因此只要具有push_back()pop_back()操作的线性结构,都可以作为stack...但是STL中对stackqueue默认选择deque作为其底层容器,主要是因为: stackqueue不需要遍历(因此stackqueue没有迭代器),只需要在固定的一端或者两端进行操作。

51320

【stack】【queue】【priority_queue】【deque】详解

stack 是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定 的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入弹出。...但是 STL 中对 stack queue 默认选择 deque 作为其底层容器,主要是因为: stack queue 不需要遍历(因此stackqueue没有迭代器) ,只需要在固定的一端或者两端进行操作...STL标准库中stackqueue的底层结构 虽然stackqueue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为stackqueue只是对其他容器的接口进行了包装...,STL中stackqueue默认使用deque,比如: ​ 也就是说,容器适配器就是将已经存在的容器(如vector)拿过来实现适配器,达到复用的效果!...但是为了 STL 中的接口保持一致:STL 增加了一个模板参数 Container,利用 Container 来进行转换,而 STL 中还用 deque 去作为默认的适配器实现 stack,所以我们这里就统一使用

76330
领券