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()
标签:const,Qt,int,list,介绍,列表,value,QList 来源: https://blog.csdn.net/mabiao0825/article/details/115759476