list源码1(参考STL源码--侯捷):list节点、迭代器、数据结构

list源码2(参考STL源码--侯捷):constructor、push_back、insert

list源码3(参考STL源码--侯捷):push_front、push_back、erase、pop_front、pop_back、clear、remove、unique

list源码4(参考STL源码--侯捷):transfer、splice、merge、reverse、sort

list的push_back、insert的使用如下:

#include<bits/stdc++.h>
using namespace std; int main() {
int i;
list<int> l; cout<<l.size()<<endl; // l.push_back();
l.push_back();
l.push_back();
l.push_back();
l.push_back();
cout<<l.size()<<endl; // list<int>::iterator it;
for(it=l.begin();it!=l.end();++it){
cout<<*it<<' '; //1 3 5 7 9
}
cout<<endl; it=find(l.begin(),l.end(),);
if(*it==)
l.insert(it,);
for(auto i:l) cout<<i<<' '; //1 3 99 5 7 9
cout<<endl; it=find(l.begin(),l.end(),);
if(*it==)
l.insert(it,);
for(auto i:l) cout<<i<<' '; //1 3 99 5 7 9
cout<<endl; it=find(l.begin(),l.end(),);
l.insert(it,);
for(auto i:l) cout<<i<<' '; //1 3 99 5 7 9 20
cout<<endl;
return ;
}

list缺省使用alloc作为空间适配器,并据此另外定义了一个list_node_allocator,为的是更方便地以节点大小为配置单位:

template <class T,class Alloc=alloc>
class list{
protected:
typedef __list_node<T> list_node;
//专属之空间适配器,每次配置一个节点大小
typedef simple_alloc<list_node,Alloc> list_node_allocator;
...
};

于是list_node_allocator(n)表示配置n个节点空间,以下4个函数,分别来配置、释放、构造、销毁一个节点:

protected:
//配置一个节点并传回
link_type get_node(){return list_node_allocator::allocate();}
//释放一个节点
void put_node(link_type p){list_node_allocator::deallocate(p);}
//产生(配置并构造)一个节点,带有元素值
link_type create_node(const T& x){
linke_type p=get_node();
construct(&p->data,x);//全局函数,构造/析构基本工具
return p;
}
//销毁(析构并释放)一个节点
void destory_node(link_type p){
destory(&p->data);
put_node(p);//全局函数,构造/析构基本工具
}

list提供有许多constructors,其中一个是default constructor,允许我们不指定任何参数做出一个空的list出来:

public:
list(){empty_initialize();} //产生一个空链表
protected:
void empty_initialize(){
node=get_node(); //配置一个节点空间,令node指向它
node->next=node; //令node的头尾指向自己,不设元素值
node->prev=node;
}

当我们以push_back()将新元素插入list尾端时,此函数内部调用insert():

void push_back(const T& x) {insert(end(),x);}

insert()是一个重载函数,有多种形式,其中最简单的一种如下,符合以上所需,首先配置并构造一个节点,然后在尾端进行适当的指针操作,将新节点插入进去:

//函数的目的:在迭代器position所指位置插入一个节点,内容为x
iterator insert(iterator position,const T& x){
link_type temp=create_node(x);//产生一个节点
//调整双向指针,使temp插入进去
temp->next=position.node;
temp->prev=position.node->prev;
(link_type(position.node->prev))->next=temp;
position.node->prev=temp;
return temp;
}

由于list不像vector那样有可能在空间不足时做重新配置,数据移动的操作,所以插入之前的迭代器仍然有效。

list源码2(参考STL源码--侯捷):constructor、push_back、insert的更多相关文章

  1. list源码4(参考STL源码--侯捷):transfer、splice、merge、reverse、sort

    list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL ...

  2. list源码1(参考STL源码--侯捷):list节点、迭代器、数据结构

    list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL ...

  3. list源码3(参考STL源码--侯捷):push_front、push_back、erase、pop_front、pop_back、clear、remove、unique

    list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL ...

  4. vector源码3(参考STL源码--侯捷):pop_back、erase、clear、insert

    vector源码1(参考STL源码--侯捷) vector源码2(参考STL源码--侯捷):空间分配.push_back vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效 v ...

  5. vector源码2(参考STL源码--侯捷):空间分配、push_back

    vector源码1(参考STL源码--侯捷) vector源码2(参考STL源码--侯捷) vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效 vector源码3(参考STL源 ...

  6. vector源码1(参考STL源码--侯捷):源码

    vector源码1(参考STL源码--侯捷) vector源码2(参考STL源码--侯捷) vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效 vector源码3(参考STL源 ...

  7. vector源码(参考STL源码--侯捷):空间分配导致迭代器失效

    vector源码1(参考STL源码--侯捷) vector源码2(参考STL源码--侯捷) vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效 vector源码3(参考STL源 ...

  8. STL 源码分析 (SGI版本, 侯捷著)

    前言 源码之前,了无秘密 algorithm的重要性 效率的重要性 采用Cygnus C++ 2.91 for windows cygwin-b20.1-full2.exe 下载地址:http://d ...

  9. STL源码阅读-functor与adapter

    为什么要用仿函数 函数指针不灵活,难以与STL其他组件配合使用 Adapter 将一个class的接口转换为另一个class的接口,使原本因接口不兼容而不能合作的classes,可以一起运作 STL中 ...

随机推荐

  1. 169. Majority Element (Array)

    Given an array of size n, find the majority element. The majority element is the element that appear ...

  2. oracle in和exist的区别 not in 和not exist的区别

    in 是把外表和内表作hash join,而exists是对外表作loop,每次loop再对内表进行查询.一般大家都认为exists比in语句的效率要高,这种说法其实是不准确的,这个是要区分环境的. ...

  3. Python学习之MacBook Pro中PyCharm安装pip以及itchat

    前言:Mac中自带的python没有用,自己安装了一个PyCharm,网上很多人说安装Itchat后会安装到自带的Python中去.本文记录怎么安装到自己安装的Python3.7中去.主要技术来源于h ...

  4. 【Python深入】Python中继承object和不继承object的区别

    python中定义class的时候,有object和没有object的不同?例如: class Solution(object): class Solution(): 这俩的区别在于—————— 在p ...

  5. JS脚本-零星片段

    1.这种写法:(function(){})(),同时注意:原生的异步对象的兼容性实例化方法 <script> document.domain = "qq.com"; x ...

  6. apache提示make_sock?

    [root@localhost apache]# /etc/init.d/*_apache restart 停止 *_apache: [失败] 正在启动 *_apache:(98)Address al ...

  7. Spring 框架XML文件的配置文件

    <?xml version="1.0" encoding="UTF-8"?><beans xmlns:xsi="http://www ...

  8. P1613 跑路(倍增 + floyd)

    https://www.luogu.org/problemnew/show/P1613 思路: 1.读入 2.建图 3.对于每一个点,向距离它 2^k 长度的点连一条长度为 1 的边 4.在新图上跑1 ...

  9. Maths | 二次型求偏导

  10. 【repost】jQuery笔记总结

    第一节 jQuery初步认知 jQuery概述 JQuery概念 javascript概念 基于Js语言的API和语法组织逻辑,通过内置window和document对象,来操作内存中的DOM元素 J ...