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. coderforces #387 Servers(模拟)

    Servers time limit per test 2 seconds memory limit per test 256 megabytes input standard input outpu ...

  2. Android 的 DatePicker、TimePicker或NumberPicker

    布局文件加上这个就可以,去除日期选择器.时间选择器或数值选择器的可编辑状态. android:descendantFocusability="blocksDescendants" ...

  3. Windows环境下npm install常见错误

    Windows环境下npm install安装包依赖时,常出现一些错误,下面为个人解决办法: 错误一 缺少python环境: G:\nodejs\moviesite\node_modules\bcry ...

  4. BingHack,Bing旁注API查询工具

    现在旁注查询都失效了.通过网上查询发现有人说可以通过微软的API进行旁注查询 https://datamarket.azure.com/dataset/explore/bing/search 注册登录 ...

  5. mybatis——延迟加载

    ------------------------------------------------SqlMapConfig.xml------------------------------------ ...

  6. css3 animation-fill-mode 对布局的影响

    问题描述:在小米手机上,animation-fill-mode设置为 both时,在手机上的web页面会超出屏幕宽度,出现滚动条. 解决方法:animation-fill-mode设为none. .p ...

  7. maven 使用国内代理

    一直使用 maven默认仓库,maven 的下载速度一直不快不慢:最近换了网络,maven秒变蜗牛,换了阿里云的镜像,瞬间飞快. 配置文件 ${USER_HOME}/.m2/settings.xml: ...

  8. 获取字符串中img标签的url集合(转载)

    /// <summary> /// 获取字符串中img的url集合 /// </summary> /// <param name="content"& ...

  9. [转]权限问题导致Nginx 403 Forbidden错误的解决方法

    权限问题导致Nginx 403 Forbidden错误的解决方法 投稿:junjie 字体:[增加 减小] 类型:转载 时间:2014-08-22 这篇文章主要介绍了权限问题导致Nginx 403 F ...

  10. 6、Samba 服务器配置

    1.安装samba服务 [root@rhel6_80 samba]# yum -y install samba #安装samba [root@rhel6_80 samba]# rpm -qa |gre ...