list容器下的 emplace_front() splice() 函数
目录
- emplace_front()
- splice()
- 作者的坑
- 时间复杂度
- 注意点:
- 疑惑处
emplace_front()
emplace中文为安置,那么这个函数就是安置到什么什么前面。
void emplace_front(value_type val) ;
时间复杂度:O(1)
splice()
splice译为粘接,作用就是用来粘接的。list::splice实现list拼接的功能。将源list的内容部分或全部元素删除
,拼插入到目的list。
函数有以下三种声明:
1.void splice ( iterator position, list<T,Allocator>& x );
2.void splice ( iterator position, list<T,Allocator>& x, iterator it );
3.void splice ( iterator position, list<T,Allocator>& x, iterator first, iterator last );
参数:
- position:目的list的位置,用来标明插入位置;
- x:源list、
- first,last:x里需要被移动的元素的迭代器,区间为[first, last).
三种作用:
- 1.将x的元素移动到目的list的指定位置,高效的将他们插入到目的list并从x中删除。
- 2.目的list的大小会增加,增加的大小为插入元素的大小。x的大小相应的会减少同样的大小。
- 3.把first 到 last 剪接到要操作的list对象中。
作者的坑
list的size()方法的时间复杂度为o(n)。
作者是为了splice(iterator position, list& x, iterator first, iterator last);的实现把size方法设计成了O(N)。splice方法就是为了把链表A中的一些元素直接串联到链表B中,如果size()设计为O(1)复杂度,那么做splice时就需要遍历first和last间的长度(然后把链表A保存的链表长度减去first和last(待移动的元素)之间的长度)!于是作者考虑到size方法设计为O(N),就无需在splice方法执行时做遍历了!
时间复杂度
上面都做出这种贡献了,为的就是完成list 的 splice 时间复杂度为 O(1)。
注意点:
指向被删除元素的迭代器会失效
,就会报错。
list.size()内部实现为遍历,时间复杂度为o(n)不是o(1)
.
疑惑处
搜到的大部分资料说前两个函数不会涉及到元素的创建或销毁,第三个函数会
。对此不甚解,望读者知晓后在评论区评论一下,不胜感激。
list容器下的 emplace_front() splice() 函数相关推荐
- linux网络编程九:splice函数,高效的零拷贝
1. splice函数 #include <fcntl.h> ssize_t splice(int fd_in, loff_t *off_in, int fd_out, loff_ ...
- linux网络编程:splice函数和tee( )函数高效的零拷贝
splice( )函数 在两个文件描述符之间移动数据,同sendfile( )函数一样,也是零拷贝. 函数原型: #include <fcntl.h> ssize_t splice(in ...
- Linux下的内存对齐函数
在Linux下内存对齐的函数包括posix_memalign, aligned_alloc, memalign, valloc, pvalloc,其各个函数的声明如下: int posix_memal ...
- Linux中assert头文件,linux系统下如何使用assert函数
linux系统下如何使用assert函数 只要看得懂程序的人都知道assert,在Windows下使用VC编写,使用assert之后,只需在IDE中设置为debug版或者是release版,编译器就会 ...
- C++11新特性-容器的cbegin和cend函数
该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105022922 容 ...
- linux uname内核,Linux下confstr与uname函数_获取C库与内核信息
Linux下confstr与uname函数_获取C库与内核信息 #include #include //uname int main(int argc, char **argv[]) { struc ...
- 12、oracle数据库下的存储过程和函数
ORACLE下的存储过程和函数 存储过程和函数是一种操作块,用来流程化.整体化处理业务逻辑的数据库操作方式.我理解的是相当于java开发语言中方法的概念,存储过程和函数的区别在于函数可以有返回值,而过 ...
- [css] 写出固定子容器在固定的父容器下水平垂直居中的布局
[css] 写出固定子容器在固定的父容器下水平垂直居中的布 1.父容器 position: relative,子元素 position: absolute;left: 50%;top: 50%;tra ...
- Linux系统常用函数,浅谈linux下的一些常用函数的总结(必看篇)
1.exit()函数 exit(int n) 其实就是直接退出程序, 因为默认的标准程序入口为int main(int argc, char** argv),返回值是int型的. 一般在shell下 ...
最新文章
- 教育部免费开放的2.4万门网课,都在这里!
- 9种没结果的爱(未婚者必读)!!!
- simulink中from与goto模块的使用
- 搞懂分布式技术8:负载均衡原理剖析
- loadrunner脚本设计:事务函数的使用
- java B2B2C Springcloud多租户电子商城系统-Spring Cloud Sleuth
- 【Mybatis-Plus】(一)初识Mybatis-Plus 入门案例
- 5日直播预告丨Oracle DBA的SQL编写技能提升宝典
- 1.2 线性回归的keras实现
- 『科学计算_理论』矩阵求导
- Tensorflow Day1
- 支付宝手机网站支付,错误代码 insufficient-isv-permissions 错误原因: ISV权限不足
- Ubuntu磁盘分区和挂载
- 计算机温度压力测试,整机性能与温度压力测试
- 追寻ARM的起源-Acorn电脑简史及FPGA实现
- 使用css动画实现loding效果
- 泰山OFFICE技术讲座:标点关系穷举研究-07
- 【微信小程序-原生开发】实用教程20 - 生成海报(实战范例为生成活动海报,内含生成指定页面的小程序二维码,保存图片到手机,canvas 系列教程)
- Qt去除libpng warning: iCCP: known incorrect sRGB profile
- Keil中添加对CX32L003系列芯片的支持