Qt之QList类介绍

QList类

QList类是一个提供列表的模板类,要使用这个类,头文件需要导入QList库:

#include <QList>

在qmake.pro文件中加入QList类的支持:

QT += core

QList的派生类有:QByteArrayList, QItemSelection, QQueue还有 QStringList

公共类型:

class const_iterator
class iterator
typedef ConstIterator
typedef Iterator
typedef const_pointer
typedef const_reference
typedef const_reverse_iterator
typedef difference_type
typedef pointer
typedef reference
typedef reverse_iterator
typedef size_type
typedef value_type

公共方法

QList(InputIterator first, InputIterator last)
QList(std::initializer_list args)
QList(QList &&other)
QList(const QList &other)
QList()
QList & operator=(QList &&other)
QList & operator=(const QList &other)
~QList()
void append(const T &value)
void append(const QList &value)
const T & at(int i) const
T & back()
const T & back() const
QList::iterator begin()
QList::const_iterator begin() const
QList::const_iterator cbegin() const
QList::const_iterator cend() const
void clear()
QList::const_iterator constBegin() const
QList::const_iterator constEnd() const
const T & constFirst() const
const T & constLast() const
bool contains(const T &value) const
int count(const T &value) const
int count() const
QList::const_reverse_iterator crbegin() const
QList::const_reverse_iterator crend() const
bool empty() const
QList::iterator end()
QList::const_iterator end() const
bool endsWith(const T &value) const
QList::iterator erase(QList::iterator pos)
QList::iterator erase(QList::iterator begin, QList::iterator end)
T & first()
const T & first() const
T & front()
const T & front() const
int indexOf(const T &value, int from = 0) const
void insert(int i, const T &value)
QList::iterator insert(QList::iterator before, const T &value)
bool isEmpty() const
T & last()
const T & last() const
int lastIndexOf(const T &value, int from = -1) const
int length() const
QList mid(int pos, int length = -1) const
void move(int from, int to)
void pop_back()
void pop_front()
void prepend(const T &value)
void push_back(const T &value)
void push_front(const T &value)
QList::reverse_iterator rbegin()
QList::const_reverse_iterator rbegin() const
int removeAll(const T &value)
void removeAt(int i)
void removeFirst()
void removeLast()
bool removeOne(const T &value)
QList::reverse_iterator rend()
QList::const_reverse_iterator rend() const
void replace(int i, const T &value)
void reserve(int alloc)
int size() const
bool startsWith(const T &value) const
void swap(QList &other)
void swapItemsAt(int i, int j)
T takeAt(int i)
T takeFirst()
T takeLast()
QSet toSet() const
std::list toStdList() const
QVector toVector() const
T value(int i) const
T value(int i, const T &defaultValue) const
bool operator!=(const QList &other) const
QList operator+(const QList &other) const
QList & operator+=(const QList &other)
QList & operator+=(const T &value)
QList & operator<<(const QList &other)
QList & operator<<(const T &value)
bool operator==(const QList &other) const
T & operator[](int i)
const T & operator[](int i) const

静态公共成员

QList fromSet(const QSet &set)
QList fromStdList(const std::list &list)
QList fromVector(const QVector &vector)

相关非成员

uint qHash(const QList &key, uint seed = 0)
bool operator<(const QList &lhs, const QList &rhs)
QDataStream & operator<<(QDataStream &out, const QList &list)
bool operator<=(const QList &lhs, const QList &rhs)
bool operator>(const QList &lhs, const QList &rhs)
bool operator>=(const QList &lhs, const QList &rhs)
QDataStream & operator>>(QDataStream &in, QList &list)

详细描述

QList是Qt的通用容器类之一,它将项目存储在一个列表中,该列表提供基于索引的快速访问和基于索引的插入和删除。
QList、QLinkedList < T >、QVector提供了类似的API和功能,它们通常可以互换,但会产生性能后果,以下是用例概述:

  • QVector应该是你默认的首选,QVector通常会比QList给出更好的性能,因为QVector总是在内存中顺序存储它的项目,其中QList将在堆上分配它的项目,除非sizeof(T) <= sizeof(void*)和T已经使用Q_DECLARE_TYPEINFO声明为Q _ MOBILITY _ TYPe或Q _GRAPHIN _ TYPe
  • 但是,QList在Qt应用编程接口中用于传递参数和返回值
  • 如果你需要一个真正的链表,它保证在链表中间有固定时间的插入,并且使用迭代器来代替索引,那么就使用QLinkedList

注意:QVector和QVarLengthArray都保证C兼容的数组布局,QList没有,如果您的应用程序必须与C API接口,这可能很重要
注意:只要被引用的项保留在容器中,进入QLinkedList的迭代器和对堆分配QLists的引用就保持有效,对于迭代器和对QVector的引用以及非堆分配QLists来说,情况并非如此
在内部,如果sizeof(T) <= sizeof(void*)和T已使用Q_DECLARE_TYPEINFO声明为Q _ MOBILITY _TYPE或Q 原语 TYPe,则QList表示为T的数组。否则,QList被表示为一个T*的数组,项目被分配到堆上
数组表示允许非常快速的插入和基于索引的访问。prepend()和append()操作也非常快,因为QList在其内部数组的两端预分配内存
但是,请注意,当不满足上面指定的条件时,每次追加或插入新项目都需要在堆上分配新项目,这种每项目分配将使QVector成为进行大量追加或插入的用例的更好选择,因为QVector可以在单个堆分配中为许多项目分配内存
请注意,内部数组只会在列表的生命周期内变大,从来不缩水,当一个列表被分配给另一个列表时,内部数组由析构函数和赋值运算符解除分配
下面是一个存储整数的QList和一个存储QDate值的QList的例子:

QList<int> integerList;
QList<QDate> dateList;

Qt包含一个继承QList的QStringList类,并添加了一些方便的函数,如QStringList::join()和QStringList::filter(),QString::split()从字符串创建QStringLists
QList存储一个项目列表,默认构造函数创建一个空列表,您可以使用初始值设定项列表构造函数来创建包含元素的列表:

QList<QString> list = { "one", "two", "three" };
QList<int> colindexs = {15,14,13,11,8,7,6,5,1,0};

QList provides these basic functions to add, move, and remove items: insert(), replace(), removeAt(), move(), and swap(). In addition, it provides the following convenience functions: append(), operator<<(), operator+=(), prepend(), removeFirst(), and removeLast().
QList提供了这些添加、移动和移除项目的基本功能:insert()、replace()、removeAt()、move()和swap(),此外,它还提供了以下方便的函数:append()、operator < <()、operator+=()、prepend()、removeFirst()和removeLast()
运算符<<()允许方便地向列表中添加多个元素:

list << "four" << "five";
colindexs << 15 << 14 << 13 << 11 << 8 << 7 << 6 << 5 << 1 << 0;

QList使用基于0的索引,就像C++数组一样,要访问特定索引位置的项目,可以使用运算符[](),在非常量列表中,运算符[]()返回对该项的引用,可用于赋值的左侧:

if (list[0] == "Bob")
    list[0] = "Robert";

因为QList是作为大于指针或不可移动的类型的指针数组来实现的,所以这个操作需要(常量时间),对于只读访问,另一种语法是使用at():

for (int i = 0; i < list.size(); ++i) {
    if (list.at(i) == "Jane")
        cout << "Found Jane at position " << i << Qt::endl;
}

at()可能比operator[]()快,因为它不会导致深度复制发生
一个常见的要求是从列表中删除一个项目,并对其进行处理,为此,QList提供了takeAt(),takeFirst()和takeLast(),这里有一个循环,每次从列表中删除一个项目,并对它们调用delete:

QList<QWidget *> list;
...
while (!list.isEmpty())
    delete list.takeFirst();

在列表的两端插入和移除项目非常快(在大多数情况下是恒定时间),因为QList在其内部缓冲区的两端预分配额外的空间,以允许列表两端的快速增长
如果要查找列表中某个特定值的所有匹配项,请使用indexOf()或lastIndexOf(),前者从给定的索引位置开始向前搜索,后者向后搜索,如果找到匹配项,两者都返回匹配项的索引;否则,它们返回-1。例如:

int i = list.indexOf("Jane");
if (i != -1)
    cout << "First occurrence of Jane is at position " << i << Qt::endl;

如果您只想检查列表是否包含特定值,请使用contains(),如果您想知道某个特定值在列表中出现的次数,请使用count(),如果要用另一个值替换某个特定值的所有出现,请使用replace()
QList的值类型必须是可赋值的数据类型,这涵盖了大多数常用的数据类型,但是编译器不会让你这样做,例如,将一个QWidget存储为一个值;相反,存储一个QWidget *,少数功能有附加要求;例如,indexOf()和lastIndexOf()期望值类型支持运算符==(),这些要求以每个功能为基础进行记录
和其他容器类一样,QList提供了Java风格的迭代器(QListIterator和QListIterator)和STL风格的迭代器(QList::const_iterator和QList::iterator),实际上,这些很少使用,因为您可以在QList中使用索引,QList的实现方式是基于索引的直接访问和使用迭代器一样快
QList不支持插入、前置、追加或替换对其自身值的引用,这样做会导致您的应用程序中止,并显示一条错误消息
为了使QList尽可能高效,它的成员函数在使用它之前不会验证它们的输入,除了isEmpty(),成员函数总是假设列表不为空,以索引值为参数的成员函数总是假定其索引值参数在有效范围内,这意味着QList成员函数可能会失败,如果您在编译时定义了QT_NO_DEBUG,将不会检测到失败,如果您没有定义QT_NO_DEBUG,将使用带有适当消息的Q_ASSERT()或Q_ASSERT_X()来检测故障
为了避免列表为空时失败,请在调用其他成员函数之前调用isEmpty(),如果必须传递可能不在有效范围内的索引值,请检查该值是否小于size()返回的值,但不小于0

更多成员

如果T是一个QByteArray,这个类还有几个成员可以使用,有关更多信息,请参见QByteArrayList的文档,如果T是QString,这个类有以下附加成员: filter, join, removeDuplicates, sort

成员类型文档

  • typedef QList::ConstIterator
    QList::const_iterator的Qt样式一样
  • typedef QList::Iterator
    QList::iterator的Qt样式一样
  • typedef QList::const_pointer
    const T *的Typedef,为STL兼容性提供
  • typedef QList::const_reference
    const T &的Typedef,为STL兼容性提供
  • typedef QList::const_reverse_iterator
    QList::const _ reverse _ iterator typedef为QLiST提供了STL风格的const反向迭代器
    它只是STD::reverse _ iterator < const _ iterator >的typedef
    警告:隐式共享容器上的迭代器不像STL迭代器那样工作,迭代器在容器上活动时,应该避免复制该容器
  • typedef QList::difference_type
    ptrdiff_t的Typedef,为STL兼容性提供
  • typedef QList::pointer
    T *的Typedef,为STL兼容性提供
  • typedef QList::reference
    T &的Typedef,为STL兼容性提供
  • typedef QList::reverse_iterator
    QList::reverse_iterator typedef为QList提供了STL风格的非常量反向迭代器
    它只是std::reverse_iterator的typedef
    警告:隐式共享容器上的迭代器不像STL迭代器那样工作,迭代器在容器上活动时,应该避免复制该容器
  • typedef QList::size_type
    int的Typedef,为STL兼容性提供
  • typedef QList::value_type
    用于测试的Typedef,为STL兼容性提供。

成员函数文档

  • template QList::QList(InputIterator first,
    InputIterator last)
    用迭代器范围内的内容[第一个,最后一个]构造一个QList
    输入运算符的值类型必须可转换为T
  • QList::QList(std::initializer_list args)
    从args指定的std::initializer_list构造一个列表
    仅当编译器支持C++11初始值设定项列表时,才启用此构造函数
  • QList::QList(QList &&other)
    移动-构造一个QList实例,使它指向另一个指向的同一个对象
  • QList::QList(const QList &other)
    构造other的副本
  • QList::QList()
    构造一个空列表
  • QList &QList::operator=(QList &&other)
    移动-分配other给这个QList实例
  • QList &QList::operator=(const QList &other)
    将other分配给此列表,并返回对此列表的引用
  • QList::~QList()
    销毁列表,对列表中的值和该列表的所有迭代器的引用都无效
  • void QList::append(const T &value)
    在列表末尾插入值
    示例:
QList<QString> list;
list.append("one");
list.append("two");
list.append("three");
// list: ["one", "two", "three"]

这与list.insert(size(),value)相同

  • void QList::append(const QList &value)
    这是一个重载函数,将值列表的项目追加到此列表
  • const T &QList::at(int i) const
    返回列表中索引位置i的项,i必须是列表中的有效索引位置(即0 <= i < size())
  • T &QList::back()
    提供此功能是为了STL兼容相当于last(),列表不能为空,如果列表可以是空的,那么在调用这个函数之前先调用isEmpty()
上一篇:scrapy框架的文件导出设置


下一篇:A Tour of Go最后一道习题:Web Crawler