首页 > 编程语言 >stl源码解析,deque的insert_aux

stl源码解析,deque的insert_aux

时间:2024-02-22 17:45:13浏览次数:37  
标签:deque iterator insert stl 元素 pos 源码

直接上结论:deque的insert_aux中插入开始会push back或front一个和最末尾或最前面值相同的值是为了看是否需要扩充deque内存,选这个值应该是顺手。

stl中deque的实现是通过一个存储指向各个存储区域指针的map(注意就是个指针地图,不是stl的map数据结构),里面再指向对应区域去存储实际的内容来实现的。

 

这里deque的一些常见操作,如earse,clear,push那些的细节侯捷的stl源码解析中已经讲得很清楚了。没看的网上也有直接把书里面全篇复制来的,如:

https://blog.csdn.net/yl_puyu/article/details/103361874  可以直接看这。

这里是针对stl源码解析中insert_aux中的一段,进行说明:

template <class T, class Alloc, size_t BufSize>
typename deque<T, Alloc, BufSize>::iterator
deque<T, Alloc, BufSize>
::insert_aux(iterator pos, const value_type& x) {
  difference_type index = pos - start;    // 插入点之前的元素个数
  value_type x_copy = x;
  if (index < size() / 2) {            // 如果插入点之前的元素个数比较少
    push_front(front());            // 在最前端加入与第一元素同值的元素
    iterator front1 = start;        // 以下标示记号,然后进行元素移动
    ++front1;
    iterator front2 = front1;
    ++front2;
    pos = start + index;
    iterator pos1 = pos;
    ++pos1;
    copy(front2, pos1, front1);        // 元素移动
  }
  else {                        // 插入点之后的元素个数比较少
    push_back(back());            // 在最尾端加入与最后元素同值的元素。
    iterator back1 = finish;    // 以下标示记号,然后进行元素移动
    --back1;
    iterator back2 = back1;
    --back2;
    pos = start + index;
    copy_backward(pos, back2, back1);    // 元素移动
  }
  *pos = x_copy;    // 在插入点上设定新值
  return pos;
}

书里的中对于insert_aux

在前半或选择后半进行copy时,都会进行一个加入同值元素的操作,这里并没有解释清楚为什么这么干,只是注释中说了: 在最尾端加入与最后元素同值的元素。

这里通过copy_backward来实现插入,并尽量选择移动元素少的,来降低插入开销。

然而,插入一个同值元素,主要就是为了提前看是否需要扩充内存,因为本处是insert操作,如果预先留存空间不足会引起扩充。

 

本文主要是为了记录一些看stl源码解析中一些操作的理由。

标签:deque,iterator,insert,stl,元素,pos,源码
From: https://www.cnblogs.com/zzzlight/p/18027843

相关文章

  • home-assistant core 源码粗读--对设备历史的处理(三)
    我们已经知道User等保存是直接以json的形式直接保存到文件中。先说结论:设备的检测历史默认保存在sqlite中Thedefault,andrecommended,databaseengineis SQLite whichdoesnotrequireanyconfiguration.ThedatabaseisstoredinyourHomeAssistantconfigurati......
  • (附项目源码)uni-app关于uni-ui使用问题
    uni-app关于uni-ui使用问题:https://blog.csdn.net/linan996/article/details/121503372?ops_request_misc=&request_id=&biz_id=102&utm_term=uniapp%20%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20uni_modules&utm_medium=distribute.pc_search_result.none-task-blo......
  • Java人力资源管理系统源码(含数据库)-springboot+vue+mysql
    EHR人力资源管理系统是一种利用现代技术,如云计算、大数据等,来实现企业人力资源信息电子化、流程自动化的系统。它覆盖了人力资源管理的各个方面,从招聘、考勤、绩效到薪酬、社保公积金等,为企业提供一站式的解决方案。​1.招聘管理:-职位发布:系统支持在线发布职位信息,吸引候选人......
  • SRM数字化采购管理平台-招投标管理系统-供应链协同|招投标|询比价(源码及功能分析)
    前言:通过数字化手段,采购管理可以更加高效、准确和透明。数字化采购管理系统可以集成各个流程环节,实现数据共享和协同工作,提高采购效率和成本控制能力。同时,数字化采购管理也有助于加强与供应商之间的沟通和协作,优化供应链管理,提升企业的竞争力。1.供应商准入:1)定义:评估供应商的......
  • home-assistant core 源码粗读--如何管理多用户-用户存储(二)
    程序中搜索User, 很容易命中homeassistant/auth/models.py程序中大量使用了attr.s进行模型的声明。上篇说过dataclass,以及BaseModel,区别见: https://www.modb.pro/db/412679文件中定义了5个模型,这里只需要猜测他们的意思即可,这里重点分析User。程序中搜索User, 很容易命......
  • home-assistant core 源码粗读--程序入口篇(一)
    core源码地址:https://github.com/home-assistant/core/tree/mastercore与其他container等版本区别见: https://www.home-assistant.io/installation/入口:homeassisstant/__main__.py   难点: faulthandler【错误记录的包,C语言编写】,  parser.add_mutually_exclusi......
  • Vector和deque小案例
    打分案例1.目的:5个学生,10个评委,10个评委的分数去掉最高和最低分,取平均分就是学生的分数2.思路:​ 1.抽象学生​ 2.使用vector容器存储学生​ 3.把分数放入deque容器,然后对deque容器进行排序,之后删除首尾元素3.流程:​ 1.创建学生​ 2.评委给学生打分​ 3.根据学生的分数排......
  • deque
    deque容器1.数据结构:逻辑上是连续的存储空间,实际上的由很多块定量的块空间,通过中控制连接起来2.迭代器:随机迭代器Deque是由一段一段的定量的连续空间构成。一旦有必要在deque前端或者尾端增加新的空间,便配置一段连续定量的空间,串接在deque的头端或者尾端。Deque最大的工作就......
  • 记录--源码视角,Vue3为什么推荐使用ref而不是reactive
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助ref 和 reactive 是Vue3中实现响应式数据的核心API。ref 用于包装基本数据类型,而reactive用于处理对象和数组。尽管 reactive 似乎更适合处理对象,但 Vue3官方文档更推荐使用 ref。 我的想法,ref就......
  • Hive insert into 竟然覆盖了原来的数据
      本文章向大家介绍Hiveinsertinto竟然覆盖了原来的数据,主要包括Hiveinsertinto竟然覆盖了原来的数据使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。 问题:在使用hive的insertinto往表里插入数据时,却发现原来的数......