list源码2(参考STL源码--侯捷):constructor、push_back、insert
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的更多相关文章
- list源码4(参考STL源码--侯捷):transfer、splice、merge、reverse、sort
list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL ...
- list源码1(参考STL源码--侯捷):list节点、迭代器、数据结构
list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL ...
- 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 ...
- vector源码3(参考STL源码--侯捷):pop_back、erase、clear、insert
vector源码1(参考STL源码--侯捷) vector源码2(参考STL源码--侯捷):空间分配.push_back vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效 v ...
- vector源码2(参考STL源码--侯捷):空间分配、push_back
vector源码1(参考STL源码--侯捷) vector源码2(参考STL源码--侯捷) vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效 vector源码3(参考STL源 ...
- vector源码1(参考STL源码--侯捷):源码
vector源码1(参考STL源码--侯捷) vector源码2(参考STL源码--侯捷) vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效 vector源码3(参考STL源 ...
- vector源码(参考STL源码--侯捷):空间分配导致迭代器失效
vector源码1(参考STL源码--侯捷) vector源码2(参考STL源码--侯捷) vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效 vector源码3(参考STL源 ...
- STL 源码分析 (SGI版本, 侯捷著)
前言 源码之前,了无秘密 algorithm的重要性 效率的重要性 采用Cygnus C++ 2.91 for windows cygwin-b20.1-full2.exe 下载地址:http://d ...
- STL源码阅读-functor与adapter
为什么要用仿函数 函数指针不灵活,难以与STL其他组件配合使用 Adapter 将一个class的接口转换为另一个class的接口,使原本因接口不兼容而不能合作的classes,可以一起运作 STL中 ...
随机推荐
- NTFS(Windows)、ext4(RHEL6)和xfs(RHEL7)文件系统的误删除恢复和备份
前言 对于误删除文件的设备,要马上停止任何写的操作,防止删除的文件被覆盖,导致数据丢失! 恢复NTFS文件系统下误删的文件 以Windows为例,市面上能恢复的工具不少,例如EasyRecovery. ...
- Mac 安装、卸载JDK 1.6
卸载 输入 sudo rm -fr /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin sudo rm -fr /Library/Preferenc ...
- 114. Flatten Binary Tree to Linked List 把二叉树变成链表
[抄题]: Given a binary tree, flatten it to a linked list in-place. For example, given the following tr ...
- [leetcode]26. Remove Duplicates from Sorted Array有序数组去重(单个元素只出现一次)
Given a sorted array nums, remove the duplicates in-place such that each element appear only once an ...
- tensorflow学习之(二)Seesion的两种打开模式
#Seesion的两种打开模式 import tensorflow as tf matrix1 = tf.constant([[3,3]])#一行两列的一个矩阵 matrix2 = tf.consta ...
- web集成高德地图
1.使用高德地图API需到官网添加一个Key,http://lbs.amap.com/dev/key/app 2.页面头引入 <div id="addressMap"> ...
- 2019.02.11 bzoj3165: [Heoi2013]Segment(线段树)
传送门 题意简述:要求支持两种操作: 插入一条线段. 询问与直线x=kx=kx=k相交的线段中,交点最靠上的线段的编号. 思路: 直接上李超线段树即可. 代码: #include<bits/st ...
- Java程序员职业生涯规划完整版:从程序员到CTO( 摘)
在技巧方面无论我们怎么学习,总感觉需要晋升自已不知道自己处于什么水平了.但如果有清晰的指示图供参考还是非常不错的,这样我们清楚的知道我们大概处于那个阶段和水平. Java程序员 高等特性 反射.泛型. ...
- ABP框架系列之五十:(Swagger-UI-集成)
Introduction From it's web site: "....with a Swagger-enabled API, you get interactive documenta ...
- Codeforces Round #486 (Div. 3) D. Points and Powers of Two
Codeforces Round #486 (Div. 3) D. Points and Powers of Two 题目连接: http://codeforces.com/group/T0ITBvo ...