forward_list

forward_list是C++11版本才有的。forward_list被实现为单链表,而list是一个双向链表,所以forward_list要比list高效一些。forward_list设计的时候就是追求效率的,跟我们自己写的C格式的单链表一样的高效。

考虑到效率问题,forward_list没有size成员函数。由于它本质是一个链表,有一个size成员会耗费常量的时间来计数其大小。这将需要一些额外的空间而且会降低插入和删除操作的效率。如果要获得forward_list 的大小,可以对begin和end调用distance算法操作。

forward_list 的大部分操作还是跟list差不多的,这里就简单看一些不一样的操作:

迭代器:

List是双向链表,所以有反向迭代器;而forward_list就没有反向迭代器。但是比list多了两种迭代器:

iterator before_begin() noexcept;

const_iterator before_begin() const noexcept;

 

const_iterator cbefore_begin() const noexcept;

这两种迭代器指向第一个元素之前的位置,所以不能解引用。它可以用做emplace_after, insert_after, erase_after or splice_after的参数。

添加删除元素的操作:

template <class... Args> void emplace_front (Args&&... args);

在链表头节点的前面插入一个节点,新节点是用args做参数构造出来的。

void push_front (const value_type& val);
void push_front (value_type&& val);
在链表头节点的前面插入一个节点,但是与emplace_front不同的地方就是新节点是通过拷贝或者转移了val的。
template <class... Args>   iterator emplace_after (const_iterator position, Args&&... args);
 
iterator insert_after ( const_iterator position, const value_type& val );
iterator insert_after ( const_iterator position, value_type&& val );
iterator insert_after ( const_iterator position, size_type n, const value_type& val );
template <class InputIterator>  iterator insert_after ( const_iterator position, InputIterator first, InputIterator last );
iterator insert_after ( const_iterator position, initializer_list<value_type> il );

在position之后插入新节点

iterator erase_after (const_iterator position);  
iterator erase_after (const_iterator position, const_iterator last);

删除position位置的节点

void pop_front();

删除第一个节点

因为forward_list是单链表,为了能跟list有想通的功能,所以就需要before_begin迭代器,使得可以在头节点之前插入新节点。

其他的函数都跟list的差不多,这里就不重复了。需要记住的就是forward_list没有size成员函数。需要自己计算获取其大小。

 

QLinkedList

QLinkedList才是Qt真正意义上的链表。QLinkedList实际上跟std::list是一样的,也是双向链表。QList实际内部还是一个指针数组。QLinkedList提供的函数大部分还是跟QList一样的,下面我们就看一些不同的地方。

int QLinkedList::size () const

返回链表的大小,即节点个数。而forward_list没有这个函数。

const_iterator QList::constBegin () const

const_iterator QList::constEnd () const

这是QList返回STL风格的迭代器。QLinkedList则没有提供这样的函数。

void QList::append ( const T & value )

void QList::append ( const QList<T> & value )

void QLinkedList::append ( const T & value )

QLinkedList 没有接受一个QLinkedList 参数的append函数。

最重要的区别就是:

QLinkedList没有 T &

operator[] ( int i )

链表是肯定不能支持索引操作的。

所以QList提供的所有基于索引的操作,QLinkedList都是不可能支持的,比如:

const T &

at ( int i ) const

void

insert ( int i, const T & value )

void

move ( int from, int to )

void

replace ( int i, const T & value )

T

takeAt ( int i )

void

swap ( int i, int j )

可能还有其他函数,这里就不一一列举了。

QLinkedList提供了与std::list的转换函数:

QLinkedList<T>

fromStdList ( const std::list<T> & list )

std::list<T>QLinkedList::toStdList () const

需要记住的一点:Qt容器是隐式共享的。QLinkedList自然也是支持隐式共享的。

QLinkedList和std::forward_list的更多相关文章

  1. QLinkedList和std::forward_list(都是双向链表,不支持operator[],好处可能是插入和删除都比较快)

    forward_list forward_list是C++11版本才有的.forward_list被实现为单链表,而list是一个双向链表,所以forward_list要比list高效一些.forwa ...

  2. C++ std::forward_list

    std::forward_list template < class T, class Alloc = allocator > class forward_list; Forward li ...

  3. C++ std::forward_list 基本用法

    #include <iostream> #include <string> #include <forward_list> using namespace std; ...

  4. C++ std::list 和 std::forward_list 的差别及其成员函数差异对比

    主要差别: list 是双向链表,forward_list 是双向链表. 成员函数差异: 函数名 list forward_list back() has no size() has no inser ...

  5. std::forward_list

    forward_list相比list来说空间利用率更好,与list一样不支持随机访问,若要访问除头尾节点的其他节点则时间复杂度为线性. 在forward_list成员函数里只能访问头节点以及向头节点插 ...

  6. forward_list详解

    forward_list在头文件<forward_list>中,与list类似,区别就是list时双链表,forward_list是单链表,forward_list只支持前向迭代.在访问第 ...

  7. C++的标准模板库STL中实现的数据结构之链表std::list的分析与使用

    摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解,即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第二篇.主要针对线性表中的链表 ST ...

  8. C++ std::list 基本用法

    #include <iostream> #include <string> #include <list> using namespace std; // http ...

  9. std::map使用结构体自定义键值

    使用STL中的map时候,有时候需要使用结构题自定义键值,比如想统计点的坐标出现的次数 struct Node{ int x,y; }; ...... map<Node,int>mp; m ...

随机推荐

  1. C/C++中volatile关键字详解 (转)

    1. 为什么用volatile? C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrier.这是 BS 在 "The ...

  2. hdu3507

    题意: 给n(n<=10^6)个非负数字,放在一个数组num中,再给一个特殊值m.求将这个数组分成任意多个区间,每个区间[a,b]的值定义为( sigma(num[i] | (a<=i&l ...

  3. cocos2d-X-3.X 场景与层

    1场景与层的相关函数 1. void runWithScene(Scene * scene). 该函数可以运行场景.只能在启动第一个场景时调用该函数.如果已经有一个场景运行,则不能调用该函数. 2.  ...

  4. 用C++写一个简单的发布者

    节点是一个可执行程序,它连接到了ROS的网络系统中.我们将会创建一个发布者,也就是说话者节点,它将会持续的广播一个信息. 改变目录到之前所建立的那个包下: cd ~/catkin_ws/src/beg ...

  5. springmvc的ModelAndView的简单使用

    参考:http://blog.csdn.net/zzjjiandan/article/details/34089313 先上图: MAVTest.java package com.wyl; impor ...

  6. 【转】CentOS 使用yum命令安装出现错误提示”could not retrieve mirrorlist http://mirrorlist.centos.org ***”

    源自:http://www.cnblogs.com/yangbingqi/p/3328610.html 刚安装完CentOS,使用yum命令安装一些常用的软件,使用如下命令:yum grouplist ...

  7. vc6.0批量编译

    一直想研究一下怎么让电脑批处理编译程序,今天就从vc6开始,做个记录,学习一下. VC可以生成make文件(Project->Export Makefile),在设置好环境变量下,执行NMAKE ...

  8. cocos2dx 坐标和锚点

    cocos2dx中使用opengl坐标系,左下角为坐标原点,在大部分情况下,都是使用这种坐标系的. 当我们创建了一个渲染对象到窗口后,那么这个对象本身也是也是有自己的坐标系的,这种坐标系是节点自己的坐 ...

  9. 我的 Azure VM 为何会重新启动?

    在客户创建的客服案件中, Azure VM意外重启是一个常见的问题,客户要求客服确定重新启动的原因.希望下面的详细说明能够帮助您了解 Azure VM重新启动的原因. WindowsAzure大约 ...

  10. ruiy_ocfs2

    http://docs.oracle.com/cd/E37670_01/E37355/html/ol_instcfg_ocfs2.html