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)
.
疑惑处
搜到的大部分资料说前两个函数不会涉及到元素的创建或销毁,第三个函数会
。对此不甚解,望读者知晓后在评论区评论一下,不胜感激。