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

STL源码拆解】forward_list容器插入、删除等是怎么实现

上篇文章我们介绍了forward_list整体类实现和构造实现,知道它其实就是个单链表,本篇文章接着介绍它插入、删除、去重、反转等操作实现以及相应时间复杂度。...,要从头结点一个结点一个结点推过去,效率会很差,所以根据标准库性能优先原则,forward_list是不提供尾部插入函数,所以它只有头部插入和根据位置插入两种,下面我们一一看看他们都是怎么实现...,然后当前结点又指向新结点,所以_M_insert_after其实就是在指定结点后面插入一个新结点,结合整体调用过程来看,就是在头结点后面插入一个新结点,也就是所谓从头部插入。...从整个调用过程来看,头部插入时间复杂度为O(1)。...3. forward_list中插入另外一个forward_list 我们之前也多次说过了,forward_list其实就是一个单链表结构,所以它也支持在当前forward_list某个位置插入另外一个

68350

如何优雅传递 stl 容器作为函数参数来实现元素插入和遍历?

后台为了保证消息一定可以推到客户端,它采取了一种重复推送策略,也就是说,每次当我重新连接上后台时,后台会把一段时间内消息都推给我、而不论这些消息之前是否已经推送过,如果我不加处理直接推给产品,可能造成同一个消息重复展示多次问题...别着急,真正难点在于从数据库恢复数据。首先直接使用迭代器是不行了,因为我们现在要往容器插入元素,迭代器只能遍历元素,一点帮助也没有。...= vec.end (); ++ it) 7 printf ("%d\n", *it); 8 9 return 0; 10 } 为了在容器尾部插入元素,标准库算法借助了...结语 其实本文讲解了一种通用通过 iterator 读取容器、通过 inserter 插入容器元素方法,这种方式较之直接传递容器本身“优雅”不少,虽然不能实现 100% 无缝切换容器,但是也提供了极大灵活性...特别是还研究了如何将这种方式实现模板函数在不同文件中分别声明与实现,达到解除代码耦合目的,具有较强实用性。

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

C++拾趣——STL容器插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——插入

遍历分为从头部和尾部两个方向遍历;         查找操作只对比set和map系列容器。因为其他容器查找都需要遍历进行对比,性能远不及这两类容器插入 头部插入 元素个数>15000 ?...当元素个数比较少(大概小于256)时,有序关联容器性能比无序(unordered)关联容器要高(除了unordered_set)。 中间插入 元素个数>15000 ?...forward_list、list和deque在不同元素个数时表现都很优异。         set容器是所有关联容器中性能最好。 尾部插入 元素个数>15000 ?...结论:         在尾部插入时,vector性能是最好。其他两个场景下,vector性能都是最差。但是在中间插入场景,容器元素个数小于256时,vector还是最优。...文中图例可从如下地址获取:https://github.com/f304646673/stl_perf/tree/master/windows

1.7K11

C++拾趣——STL容器插入、删除、遍历和查找操作性能对比(ubuntu g++)——插入

遍历分为从头部和尾部两个方向遍历;         查找操作只对比set和map系列容器。因为其他容器查找都需要遍历进行对比,性能远不及这两类容器插入 头部插入 元素个数>15000 ?...insert_begin_16384_highest         往vector容器头部插入数据,所需要时间会随着容器元素增多而变得很慢。        ...结论:         vector容器在头部、中间插入时性能随着元素个数增多,性能变非常糟糕。但是在尾部插入场景下,性能是极好。        ...forward_list和deque插入操作性能在各种场景下,都比较好。         list容器在头部和中间插入时,效率很好。但是在尾部插入时,性能不太好。         ...文中图例可从以下地址获取:https://github.com/f304646673/stl_perf/tree/master/linux

82320

Thrift数据类型

结构 Thrift 结构定义了一个通用对象——它们本质上等同于 OOP 语言中类,但没有继承。 结构有一组类型字段,每个字段都有一个唯一名称标识符。...字段可能具有 Thrift IDL 中描述各种注释(数字字段 ID、可选默认值等)。 容器 Thrift 容器类型容器,映射到大多数编程语言中常用和常用容器类型。...共有三种容器类型: list:元素有序列表。 转换为 STL 向量、Java ArrayList、脚本语言中本机数组等。 set:一组无序唯一元素。...此外,JSON 协议仅支持作为基本类型键类型。 异常 异常在功能上等同于结构,除了它们在每种目标编程语言中适当地从本机异常基类继承,以便与任何给定语言本机异常处理无缝集成。...请注意,纯 void 函数将向客户端返回响应,以保证操作已在服务器端完成。 使用单向方法调用,客户端只能保证请求在传输层成功。 同一客户端单向方法调用可以由服务器并行/乱序执行。

91330

C++拾趣——STL容器插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——删除

相关环境和说明在《C++拾趣——STL容器插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——插入》已给出。...erase_begin_1024         由于vector性能太差,上图例中没有将其列出来。         我们可以观察到,各个容器在特别的元素个数时,会同步发生高耗时操作。...结果对比:         vector性能始终最差。         除了vector,非关联容器性能都优于关联容器。         除了vector,set和map性能最差。...erase_mid_256_highest         和小容器插入表现不同,vector在从中间删除元素时效率依旧糟糕。...文中图例可从如下地址获取:https://github.com/f304646673/stl_perf/tree/master/windows

1.5K30

C++ 里“数组”

C++ 解决方案 C++ 有两种常用替换 C 数组方式: vector array vector C++ 标准模板库(STL主要组成部分是: 容器 迭代器 算法 函数对象 而说到容器,我们通常第一个讨论就是...当一个容器存在 push_… 和 pop_… 成员函数时,说明容器对指定位置删除和插入性能较高。...vector 一些重要操作(如 push_back)试图提供异常安全保证,即如果操作失败(发生异常)的话,vector 内容完全不发生变化,就像数据库事务失败发生了回滚一样。...如果元素类型没有提供一个保证不抛异常移动构造函数,vector 此时通常会使用拷贝构造函数。...C++11 开始提供 emplace… 系列函数是为了提升容器插入性能而设计

9510

C++拾趣——STL容器插入、删除、遍历和查找操作性能对比(ubuntu g++)——删除

相关环境和说明在《C++拾趣——STL容器插入、删除、遍历和查找操作性能对比(ubuntu g++)——插入》已给出。本文将分析从头部、中间和尾部对各个容器进行删除性能。...deque在元素超过2500左右时,“迎头赶上”,成为第三差容器。 元素个数<1024 ?...erase_mid_16256         除了vector,表现最差是map系列三个容器:multimap、map和unordered_multimap。        ...非关联容器表现都由于关联容器。 元素个数<256 ? erase_end_256         大容器表现在小容器上也有着相似的体现。 结果对比:         vector效率最优。...文中图例可从以下地址获取:https://github.com/f304646673/stl_perf/tree/master/linux

1.8K40

UNIX(多线程):24---哪些STL容器是线程安全

在日常C++开发,少不了和STL,多线程打交道,那么在多线程下,哪些容器时线程安全,那些不是?...其他容器也是类似的,大家也可以尝试去写一些代码验证。 一般说来,stl对于多线程支持仅限于下列两点: 1.多个读取者是安全。即多个线程可以同时读取一个容器内容。...但是对于同一容器当有线程写,有线程读时,如何保证正确? 需要程序员自己来控制,比如:线程A读容器某一项时,线程B正在移除该项。这会导致一下无法预知错误。...通常解决方式是用开销较小临界区(CRITICAL_SECTION)来做同步。 以下列方式同步基本上可以做到线程安全容器(就是在有写操作情况下仍能保证安全)。   ...当你调用stl一些方法返回一个iterator, 如果有别的线程正在修改这个容器, 你iterator就变得无效了, 再用这个iterator行为就可能出问题.

2.2K20

C++拾趣——STL容器插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——遍历和删除

相关环境和说明在《C++拾趣——STL容器插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——插入》已给出。本文将分析各个容器中遍历和查找性能。...其他容器性能差距不大。         非关联容器中,list性能最差。...结论:         除了map、multimap、set和multiset,其他容器遍历性能都差不了太多。 查找         因为非关联容器查找只能通过遍历,其效率和关联容器查找没法比。...multi类要优于对应非multi类容器。...无序关联容器要优于有序关联容器。        文中图例可从如下地址获取:https://github.com/f304646673/stl_perf/tree/master/windows

1.8K20

HTTP 请求轻松搞定:Swift 网络编程不二之选 | 开源日报 No.38

类似 STL 容器访问方式,可以通过下标或迭代器对 JSON 进行访问和修改。 支持将 STL 容器转换为 JSON 对象以及将任意类型转换为与之相应 JSON 值。...该项目具有以下核心优势: 简单易用 format API,支持用于本地化位置参数 实现了 C++20 标准中 std::format 函数 类似于 Python format 函数格式字符串语法...快速 IEEE 754 浮点格式化程序,使用 Dragonbox 算法提供正确舍入、短距离和往返保证 可移植性,并支持 Unicode 字符集处理 安全可靠:通过类型检查,在编译时报告错误;自动内存管理防止缓冲区溢出等问题...可以在任何地方进行零停机时间部署 Kamal 使用动态反向代理 Traefik 来保持请求,在启动新应用容器并停止旧容器保证服务正常 通过 SSHKit 执行命令,并支持多主机环境下运行 最初为 Rails...,它通过将日志、指标、跟踪、异常和会话重放集中在一处来帮助工程师更快地找出生产环境故障原因。

29220

C++拾趣——STL容器插入、删除、遍历和查找操作性能对比(ubuntu g++)——遍历和查找

相关环境和说明在《C++拾趣——STL容器插入、删除、遍历和查找操作性能对比(ubuntu g++)——插入》已给出。本文将分析各个容器中遍历和查找性能。...其在遍历到1000个左右元素时发生较高延时操作,然后又稳定下来。         除了这个容器,再看下其他容器表现。 ?...关联容器遍历效率没有非关联容器高。 查找          因为非关联容器查找只能通过遍历,其效率和关联容器查找没法比。所以我们只比较关联容器 元素个数>15000 ?...结论:         unordered系列容器比ordered系列容器效率高。         ordered系列容器中,map系列比set系列对应容器效率高。...文中图例可从以下地址获取:https://github.com/f304646673/stl_perf/tree/master/linux

2.9K10

【C++】STL 标准模板库 ③ ( STL 容器简介 | STL 容器区别 | STL 容器分类 | 常用 STL 容器 )

一、STL 容器简介 1、STL 容器区别 STL 容器 用于管理 一组 数据元素 , 不同类型 STL 容器 区别 主要是 节点 和 节点之间关系模型 不同 ; 容器内存空间是否连续 : 向量...中元素不允许重复 ; 容器元素插入限制 : 是否允许 插入到中间 , 插入到首部 , 插入到尾部 ; 容器元素移除限制 : 是否允许 移除中间元素 , 移除首部元素 , 移除尾部元素 ; 数据结构..., 多重集合 MultiSet , 映射 Map , 多重映射 MultiMap 是 关联式容器 ; 如下图所示 , 关联式容器元素位置与特定规则有关 , 与插入时间和位置无关 ; 3、常用 STL...容器 常用 STL 容器 : 向量 vector : 是连续存储元素 , 其内存是连续 ; 可以 访问和修改任意元素 , 但在 序列尾部 进行 插入 和 删除时 , 具有常量时间复杂度 ; 需导入...; 多重集合 元素在容器中根据指定比较函数按键值排序 , 因此它是有序 ; 多重集合 元素不需要具有唯一键 , 一个键值可具有多个相关联元素值 ; 需导入 头文件 ; 映射

24430

CC++工程师面试题(STL篇)

STL 中有哪些常见容器 STL容器分为顺序容器、关联式容器容器适配器三种类型,三种类型容器特性分别如下: 1....关联式容器 元素是排序插入任何元素,都按相应排序规则来确定其位置;在查找时具有非常好性能;通常以平衡二叉树方式实现,包含set、map。...queue:队列 插入只可以在尾部进行,删除、检索和修改只允许从头部进行,先进先出。 STL 容器用过哪些,查找时间复杂度是多少,为什么?...简述 vector 实现原理 vector 是一种动态数组,在内存中具有连续存储空间,支持快速随机访问,由于具有连续存储空间,所以在插入和删除操作方面,效率比较慢。...这保证了红黑树关键性质:最长路径不超过最短路径两倍。 2.

9900

一些关于广泛使用C++标准库STL思考

erase 了解你排序选择 remove后接erase from 《STL源码剖析》 容器 vector from Effective STL 1、接纳typedef 我们可以通过自由容器和迭代器类型使用...这就是STL方式。 不只是增,删改、排序也是如此。 如果你用一个拷贝过程很昂贵对象填充一个容器,那么一个简单操作——把对象放进容器也会被证明为是一个性能瓶颈。...那就是说,如果你以基类对象建立一个容器,而你试图插入派生类对象,那么当对象(通过基类拷贝构造函数)拷入容器时候对象派生部分会被删除。...但并不是异常安全。不要吹毛求疵,编程就是要吹毛求疵。 如果在手动分配空间到手动回收空间这之间,系统异常了,那这些内存不是照样遭殃?...良好定义行为! } 直截了当而且类型安全。 以上。以下又是我看得懂了,这个方法依旧不是异常安全,那要如何做到异常安全呢?使用智能指针。 关于智能指针,等我后天开始研究了那两本书,下一篇会出。

44830

三十分钟掌握STL

为了具有足够通用性,STL主要依赖于模板而不是封装,继承和虚函数(多态性)——OOP三个要素。你在STL中找不到任何明显类继承关系。...这好像是一种倒退,但这正好是使得STL组件具有广泛通用性底层特征。另外,由于STL是基于模板,内联函数使用使得生成代码短小高效。...提示 确保在编译使用了STL程序中至少要使用-O优化来保证内联扩展。STL提供了大量模板类和函数,可以在OOP和常规编程中使用。...插入迭代器 插入迭代器用于将值插入容器中。它们也叫做适配器,因为它们将容器适配或转化为一个迭代器,并用于copy()这样算法中。...将对象插入容器任何对象前面。

2K80

STL小结

容器 特性 所在头文件 向量vector 可以用常数时间访问和修改任意元素,在序列尾部进行插入和删除时,具有常数时间复杂度,对任意项插入和删除就有的时间复杂度与到末尾距离成正比,尤其对向量头添加和删除代价是惊人... 双端队列deque 基本上与向量相同,唯一不同是,其在序列头部插入和删除操作也具有常量时间复杂度 表list 对任意元素访问与对两端距离成正比,但对某个位置上插入和删除一个项花费为常数时间...容器适配器接口更为简单,只是受限比一般容器要多。 迭代器适配器:修改为某些基本容器定义迭代器接口一种STL组件。反向迭代器和插入迭代器都属于迭代器适配器,迭代器适配器扩展了迭代器功能。...Set Map详解: STL map和set使用虽不复杂,但也有一些不易理解地方,如: 为何map和set插入删除效率比用其他序列容器高?...STL使用模板生成,当我们使用模板时候,每一个EXE,和DLL都在编译器产生了自己代码,导致模板所使用静态成员不同步,所以出现数据传递各种问题,下面是详细解释。

81910

【C++】set和map使用

对于STL容器来说,有很多相似的功能,所以这里主要将与之前不同功能说清楚 @TOC 1.对于set与map简单理解 vector/list/deque 作为序列式容器(类似于线性表存储方式) map...与set作为关联式容器,里面存储是结构键值对(数据之间有非常关联关系) 键值对:用来表示一 一对应关系,key代表键值,value代表与key对应信息 如:中英文互译字典...insert 由于底层是二叉搜索树,所以要注意若插入相同key值,就会造成插入失败 迭代器遍历 set底层是二叉搜索树,所以重复值在树中插入会失败 相当于完成了去重操作 ---- 不能随便修改...*it数据,set底层作为二叉搜索树,若将其中一个key值进行修改,就没办法保证修改后是不是搜索树了 ---- 支持迭代器就是支持范围for,范围for底层就是迭代器 count 给一个值,判断在不在...若在返回非0,若不在返回0 但是由于set不支持重复key值插入,所以count只能判断在不在 count效果与二叉搜索树应用场景写法,效果是等价 x作为key值,若存在则进入if 输出在

7920

C++ STL 概述_严丝合缝合作者

从而构建出一个精密、灵活、具有高度自适应编程环境。 如下图为组件之间分工合作关系: 学习STL包括: 了解、熟悉各组件使用。 掌握各组件之间服务关系。...STL使用了高内聚、低耦合设计理念,各组件专业能力非常,合作时又能做到润物细无声。 容器专注于数据存储。 迭代器专注于容器访问。 函数对象提供具体算法策略。...容器STL核心(无数据无程序),下面简要介绍容器通用操作。 2. 容器 STL容器和数组相似,能够存储数据集,但有其自身特点: 支持容量自动增长。...=end; begin++) { cout<<*begin<<"\t"; } 输出结果: 关联式容器插入数据效果和序列式容插入效果会有不同。...序列式容器插入数据后,期望位置和最终结果位置是一样。如期望插入在第 3 个数据之后,实际也是插入在第 3 个数据之后。

46220

《逆袭进大厂》第四弹之C++重头戏STL30问30答

当一个元素被插入到一个STL列表(list)中时,列表容器自动为其分配内存,保存数据。考虑到要将STL容器放到共享内存中,而容器却自己在堆上分配内存。...1) map下标运算符[]作用是:将关键码作为下标去执行查找,并返回对应值;如果不存在这个关键码,就将一个具有该关键码和值类型默认值插入这个map。...200、 STL中list与queue之间区别 1) list不再能够像vector一样以普通指针作为迭代器,因为其节点不保证在存储空间中连续存在; 2) list插入操作和结合才做都不会造成原有的list...之所以选择vector为存放桶元素基础容器,主要是因为vector容器本身具有动态扩容能力,无需人工干预。...同样,queue也可以使用list作为底层容器,不具有遍历功能,没有迭代器。

1.4K20
领券