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

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_afterinsert_aftererase_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自然也是支持隐式共享的。

http://blog.csdn.net/hai200501019/article/details/11787097

时间: 2024-10-05 21:51:44

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

C语言双向链表简单实现及图示(初始化/插入节点/删除节点)

-------------------------------------------- 双向链表 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 和单向链表相比有以下优势: 插入删除不需要移动元素外,可以原地插入删除 可以双向遍历 - - - - -

C++ std::forward_list 基本用法

#include <iostream> #include <string> #include <forward_list> using namespace std; // https://zh.cppreference.com/w/cpp/container/forward_list std::ostream& operator<<(std::ostream& ostr, const std::forward_list<int>&

list双向链表容器应用基础(创建、遍历、插入、删除、归并、排序及连续重复元素剔除等)

不同于采用线性表顺序存储结构的vector和deque容器,list双向链表中任一位置的元素差值.插入和删除,都具有高效的常数阶算法时间复杂度O(1). 头文件 #include<list> 创建list对象 1)list();//创建一个没有任何元素的list对象. list<int>l 2)list(size_type n);//创建一个具有n个元素的list对象,每个元素采用它的类型下的默认值. list<int>l(10);//list对象l有10个元素,每个元

90%的 CTO 都做不好绩效管理?看看这个十年 IT 老兵都有什么绝活?(转)

原文地址: http://mp.weixin.qq.com/s/uiGMx5vuD3YNaoCClHuqEg 十多年从业经历,从 2001 年开始带团队到现在,我几乎经历过所有的 IT 角色.2010 年,我随创始团队筹建国美在线至今,经历了从几百单到现在日均百万订单,从只有家电品类到现在全品类.金融.大数据服务.云服务的综合平台,从 5 人到现在的上千人的技术团队建设过程. IT 技术团队的绩效考核是比较头痛的事情.从技术员工的角度来讲,我和大家一样是很反感绩效考核的,主要原因是技术绩效到底怎

c语言 双向链表的简单操作-创建、插入、删除

数据结构-双向链表的创建.插入和删除 双向链表是数据结构中重要的结构,也是线性结构中常用的数据结构,双向指针,方便用户从首结点开始沿指针链向后依次遍历每一个结点,结点的前驱和后继查找方便. #include <stdio.h> #include <stdlib.h> //双向链表结点的定义 typedef struct dbnode { int data; struct dbnode *prio, *next; }DbNode, linkdblist; //创建双向链表 DbNod

为什么都反对XML而支持使用json呢?

一个使用上的因素:JSON的结构更容易映射至一般语言的数据结构. XML和JSON的主要组成成分: XML是element.attribute和element content. JSON是object.array.string.number.boolean(true/false)和null. XML要表示一个object (指name-value pair的集合),最初可能会使用element作为object,每个key-value pair 用 attribute 表示: <student n

用c语言完成一个双向链表的创建,插入,删除

/*dlist.h*/ #ifndef DList_H #define DList_H typedef  int Item; typedef struct Node * PNode;  //节点指针 typedef PNode Position;  //节点位置 /*定义节点类型*/ typedef struct Node { Item data;      /*数据域*/ PNode previous; /*指向前驱*/ PNode next;     /*指向后继*/ }Node; /*定义

Poseidon 系统是一个日志搜索平台——认证看链接ppt,本质是索引的倒排列表和原始日志数据都存在HDFS,而文档和倒排的元数据都在NOSQL里,同时针对单个filed都使用了独立索引,使用MR来索引和搜索

Poseidon 系统是一个日志搜索平台,可以在百万亿条.100PB 大小的日志数据中快速分析和检索.360 公司是一个安全公司,在追踪 APT(高级持续威胁)事件,经常需要在海量的历史日志数据中检索某些信息,例如某个恶意样本在某个时间段内的活动情况.在 Poseidon 系统出现之前,都是写 Map/Reduce 计算任务在 Hadoop 集群中做计算,一次任务所需的计算时间从数小时到数天不等,大大制约了 APT 事件的追踪效率.Poseidon 系统就是解决这个需求,能在数百万亿条规模的数据

双向链表(插入,删除,追加,正反向遍历,查找。。。)

#include <iostream> #include <stdexcept> using namespace std; class List { public: List(void) : m_head(NULL), m_tail(NULL), m_size(0){} ~List(void) { for(Node* node = m_head; m_head; m_head = node) { node = m_head->m_next; delete m_head; }