List (双向链表) 与 forwardlist (单向链表) 算是非常基础的数据结构了,这里只是简单介绍下其结构及应用。

以list为例:

其节点模板:

template <class T>
struct  _list_node {
    _list_node<T>* prev;
    _list_node<T>* next;
    T data;
};

      结构示意图

  关于list的迭代器

  由于list的节点并不一定在存储空间中连续存在,所以list不再能够像vector一样以普通指针作为迭代器。由于list是一个双向链表,迭代器应该具备前移,后移的能力,所以list提供的是Bidirectional iterators.(双向迭代器)

  List有一个重要性质:插入操作(insert)和接合操作(splice)都不会造成原有的list迭代器的失效。这在vector是不成立的。(vector的插入操作可能会造成空间的重新分配,导致原有的迭代器全部失效)。甚至list的元素删除操作(erase),也只有“指向被删除元素”的那个迭代器失效,其他迭代器不受任何影响。(迭代器结构,如图:)

  

  SGI list不仅是一个双向链表,而且还是个环状双向链表。List模板如下:

template <class T, class Alloc = allocator<T> >
class list {
//…
protected:
    link_type node;     // _list_node<T>* node
};

            其构造如图所示:

  测试代码如下:

#include <list>
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    list<int, allocator<int>> mylist;
    cout << "size = " << mylist.size() << endl;      // size = 0

    mylist.push_back();
    mylist.push_back();
    mylist.push_back();
    mylist.push_back();
    mylist.push_back();

    cout << "size = " << mylist.size() << endl;     // size = 5

    list<int>::iterator iter;
    for (iter = mylist.begin(); iter != mylist.end(); iter++) {
        cout << *iter << " ";                       // 1 4 3 9 9
    }
    cout << endl;

    iter = find(mylist.begin(), mylist.end(), );
    ) {
        mylist.insert(iter, );
    }

    cout << "size = " << mylist.size() << endl;     // size = 6
    cout << *iter << endl;                          

    iter = find(mylist.begin(), mylist.end(), );
    ) {
        cout << *(mylist.erase(iter)) << endl;
    }

    for (iter = mylist.begin(); iter != mylist.end(); iter++) {
        cout << *iter << " ";                       //  4 99 3 9 9
    }
    cout << endl;

    ;
}

  forward_list(单向链表)与list(双向链表)的区别主要在于,前者的迭代器属于单向的forward iterator, 后者的迭代器属于双向的bidirectional iterator. 为此,forward_list的功能自然也就受到了很多限制。不过,单向链表所消耗的空间更小(没有指向前面节点的指针),某些操作更快,也不失为一种选择。这里就不详细介绍了,附2张结构示意图。

              forward_list迭代器示意图:

      

              存储构造如图所示:

STL之序列式容器list与forward_list的更多相关文章

  1. STL中序列式容器的共性

    代码如下: /* * vector_1.cpp * * Created on: 2013年8月6日 * Author: Administrator */ #include <iostream&g ...

  2. STL源码剖析读书笔记--第四章--序列式容器

    1.什么是序列式容器?什么是关联式容器? 书上给出的解释是,序列式容器中的元素是可序的(可理解为可以按序索引,不管这个索引是像数组一样的随机索引,还是像链表一样的顺序索引),但是元素值在索引顺序的方向 ...

  3. STL源码剖析之序列式容器

    最近由于找工作需要,准备深入学习一下STL源码,我看的是侯捷所著的<STL源码剖析>.之所以看这本书主要是由于我过去曾经接触过一些台湾人,我一直觉得台湾人非常不错(这里不涉及任何政治,仅限 ...

  4. STL序列式容器学习总结

    STL序列式容器学习总结 参考资料:<STL源码剖析> 参考网址: Vector: http://www.cnblogs.com/zhonghuasong/p/5975979.html L ...

  5. STL——序列式容器

    一.容器概述与分类 1. STL容器即是将运用最广的一些数据结构实现出来.常用的数据结构有array, list, tree, stack, queue, hash table, set, map…… ...

  6. STL源码剖析——序列式容器#1 Vector

    在学完了Allocator.Iterator和Traits编程之后,我们终于可以进入STL的容器内部一探究竟了.STL的容器分为序列式容器和关联式容器,何为序列式容器呢?就是容器内的元素是可序的,但未 ...

  7. STL源码剖析:序列式容器

    前言 容器,置物之所也.就是存放数据的地方. array(数组).list(串行).tree(树).stack(堆栈).queue(队列).hash table(杂凑表).set(集合).map(映像 ...

  8. STL学习笔记(序列式容器)

    Vector Vector是一个动态数组. 1.Vector的操作函数 构造.拷贝和析构 vector<Elem> c //产生一个空vector ,其中没有任何元素 vector< ...

  9. 数据结构-STL序列式容器总结

    根据序列在容器中的排列特性,将常见数据结构分为:序列式容器和关联式容器. 常见序列式容器有 1.array(build-in)c++內建 2.vector 3.heap(以算法方式呈现) 4.prio ...

随机推荐

  1. 补交作业-第八周PSP

    一.表格 C(分类) C(内容) S(开始时间) ST(结束时间) I(打断时间) △(净工作时间) 讨论 用户界面 9:30 10:40 15 55 编码 编码 13:20 16:30 10 180 ...

  2. online_jf.lua --累计在线时间领取物品(积分)的lua脚本

    原作者: ayase 8-27修正 修复首次使用后的红字不需要额外进数据库导入计分表,这lua全自动生成 ----------------------------------------------- ...

  3. 关于python如何简单跳出多层循环

    上述代码的逻辑是,在跳出子循环之前定义一个变量flag为Ture,第一层循环跳出之后,如果要跳出第二个循环,直接调用变量flag,可以直接跳出第二层循环.这里要注意的是缩进,不然会出错误. 如果是多层 ...

  4. js获取ip地址

    方法三(所有的平台及浏览器):使用的搜狐接口 <script src="http://pv.sohu.com/cityjson?ie=utf-8"></scrip ...

  5. 动态加载(异步加载)jquery/MUI类库 页面加载完成后加载js类库

    动态加载Mui类库: // ==UserScript== // @name // @version 1.4.0 // @author zzdhidden@gmail.com // @namespace ...

  6. 网络请求三方库——OkHttp

    我们知道在Android开发中是可以直接使用现成的API进行网络请求的,就是使用 HttpClient 和 HttpURLConnention ,而Android 4.4 之后 HttpClient  ...

  7. javaweb页面上展示动态图片

    HTML <img alt="点击设定" name="CONSTRUCTIONPLANHIS_IMAGE_curr_img_0" src="vi ...

  8. PChar,PAnsiChar,String,AnsiString,Char数组,AnsiChar数组转换

    PChar,PAnsiChar,String,AnsiString,Char数组,AnsiChar数组之间的转换关系见下图 通过转换链,可以实现任意两个类型之间的互转.如PChar转PAnsiChar ...

  9. 安装ntp

    #yum -y install ntp#service ntpd restart#vi /etc/ntp.confserver 0.aisa.pool.ntp.org iburstserver 1.a ...

  10. appium Ruby自动化测试搭建