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. JavaScript中reduce()方法

    原文  http://aotu.io/notes/2016/04/15/2016-04-14-js-reduce/   JavaScript中reduce()方法不完全指南 reduce() 方法接收 ...

  2. [THINKING IN JAVA]初始化和清理

    4.5初始化和清理 5.1 构造器初始化 无参:如果一个类没有构造器,那么会有一个默认的无参构造器,并且只能通过无参构造器初始化对象: 带参:传入参数初始化成员变量或者其它初始化操作需要的参数,如果类 ...

  3. 关于AJAX中status中12030与12031的错误

    最近使用ajax调用一般处理程序时,出现外网调用不成功,内网调用成功,错误码为12030或12301的情况.当时在网上搜索了一些资料,有的说是因为文件中取了个中文名称导致的,有的是说要配置什么IIS之 ...

  4. (转)Image Segmentation with Tensorflow using CNNs and Conditional Random Fields

    Daniil's blog Machine Learning and Computer Vision artisan. About/ Blog/ Image Segmentation with Ten ...

  5. Lua 调用 Opencv 的方法

    Lua 调用 Opencv 的方法 最近想用 Lua 调用 Opencv 进行相关像素级操作,如:bitwise_and 或者 bitwise_or,从而完成图像 IoU 的计算. 那么,怎么用 Lu ...

  6. go语言的命令行库

    命令行应用通常很小,程序猿们也不喜欢为它编写注释.所以一些额外的工作,如解析参数有个合理的库来帮忙做就好了.https://github.com/urfave/cli 这个项目因此而生.安装:go g ...

  7. nginx(tengine)的一些小优化(持续更新)

    1.nginx日志切割脚本 需求来源:nginx本身并没有日志切割的功能,由访问产生的大日志很难进行分析. 实现目的:每天对nginx日志进行切割,并备份至指定文件夹. 简要指令: mv /usr/l ...

  8. Js 根据身份证号获取年龄-性别

    参考:http://www.tuicool.com/articles/J7r2ien 方式一: $scope.GetAgeAndSexByIDNum = function (IdCardNO) { / ...

  9. 02shell编程环境的搭建

    02shell编程环境的搭建 [02]Shell编程 02shell编程环境的搭建 在不同的操作系统上搭建shell编程环境 Linux Windows Mac 编辑器的选择 系统环境的搭建 注: 选 ...

  10. R语言-数据高级管理

    数学函数 abs() 绝对值 sqrt() 平方 ceiling() 向上取整 floor() 向下取整 trunc() 截取整数部分 round(x,digits = n) 保留几位小数 统计函数 ...