zl程序教程

您现在的位置是:首页 >  工具

当前栏目

QList类迭代器详解

迭代 详解
2023-09-11 14:16:44 时间

QList
Detailed Description
QList 是Qt的通用容器类之一。它将项目存储在一个列表中,该列表提供了基于索引的快速访问以及基于索引的插入和删除。
QList ,QLinkedList 和QVector 提供类似的API和功能。它们通常是可互换的,但是会带来性能方面的不同表现。以下是用例的概述:
1.QVector应该是您的默认首选。 QVector 通常会提供比QList 更好的性能,因为QVector 始终将它的项顺序存储在内存中,其中QList 会将其项分配在堆上,除非sizeof(T)<= sizeof(void *),并且已使用Q_DECLARE_TYPEINFO将T声明为Q_MOVABLE_TYPE或Q_PRIMITIVE_TYPE。有关说明,请参见使用QList的优缺点。
2.但是,整个Qt API都使用QList来传递参数和返回值。使用QList与这些API交互。
3.如果您需要一个真正的链表,该链表可以保证在列表中插入固定时间并使用迭代器而不是索引,请使用QLinkedList。
注意:QVector和QVarLengthArray都保证C兼容的数组布局。 QList没有。如果您的应用程序必须与C API接口,这可能很重要。
注意:只要被引用的项目保留在容器中,对QLinkedList的迭代器和对分配堆的QList的引用将一直有效。对于迭代器以及对QVector和非堆分配QList的引用,情况并非如此。
在内部,如果sizeof(T)<= sizeof(void *)并且使用Q_DECLARE_TYPEINFO声明T为Q_MOVABLE_TYPE或Q_PRIMITIVE_TYPE,则QList 表示为T的数组。否则,QList 表示为T *的数组,并且各项在堆上分配。
数组表示允许非常快速的插入和基于索引的访问。由于QList在其内部数组的两端预先分配了内存,因此prepend()和append()操作也非常快。 有关详细信息,请参见算法复杂性。
但是请注意,如果不满足上述指定条件,则新项目的每个追加或插入都需要在堆上分配新项目,并且这种按项目分配的方式将使QVector成为执行大量操作的用例的更好选择。因为QVector可以在单个堆分配中为许多项分配内存。
请注意,内部数组只会在列表的生命周期内变得更大。它永远不会收缩。当一个列表分配给另一个列表时,内部数组由析构函数和赋值运算符释放。
这是一个存储整数的QList和一个存储QDate值的QList的示例:

Qt包含一个QStringList类,该类继承了QList 并添加了一些便利功能,例如QStringList :: join()和QStringList :: filter()。
QString :: split()从字符串创建QStringLists。
QList存储项目列表。默认构造函数创建一个空列表。您可以使用initializer-list构造函数创建包含元素的列表:

QList提供了以下基本功能来添加,移动和删除项目:
insert(),replace(),removeAt(),move()和swap()。
此外,它提供以下便利功能:append(),operator <<(),operator + =(),prepend(),removeFirst()和removeLast()。
operator <<()允许方便地将多个元素添加到列表中:

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

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

at()可以比operator 更快,因为它永远不会导致深度复制的发生。

一个普遍的要求是从列表中删除一个项目并对其进行处理。为此,QList提供了takeAt(),takeFirst()和takeLast()。
这是一个循环,可一次从列表中删除项目并对其调用delete:

在列表的两端插入和删除项目非常快(在大多数情况下,时间是固定的),因为QList在其内部缓冲区的两侧预先分配了额外的空间,以允许在列表的两端快速增长。

如果要查找列表中所有出现的特定值,请使用indexOf()或lastIndexOf()。前者从给定的索引位置开始向前搜索,后者向后搜索。如果找到匹配项,则两者都返回匹配项的索引。否则,它们返回-1。例如:

如果只想检查列表是否包含特定值,请使用contains()。
如果要找出列表中特定值出现的次数,请使用count()。
如果要用另一个值替换所有出现的特定值,请使用replace()。
QList值的类型必须是可分配的数据类型。这涵盖了大多数常用的数据类型,但是编译器不允许例如将QWidget存储为值。而是存储一个QWidget *。少数功能有其他要求;例如,indexOf()和lastIndexOf()期望值的类型支持operator ==()。这些要求是按功能记录的。
像其他容器类一样,QList提供Java样式的迭代器(QListIterator和QMutableListIterator)和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。

Public Functions 公共函数
QList(InputIterator first, InputIterator last)
构造一个QList,其内容在迭代器范围[first,last)中。 InputIterator的值类型必须可以转换为T。此函数在Qt 5.14中引入
QList::QList(std::initializer_list args)
从args指定的std::initializer_list构造一个列表。仅当编译器支持C ++ 11初始化程序列表时,才启用此构造函数。此函数在Qt 4.8中引入。
QList::QList(QList &&other)
Move构造一个QList实例,使其指向other对象指向的同一对象。此函数在Qt 5.2中引入。
QList::QList(const QList &other)
构造other的副本。由于QList是隐式共享的,因此此操作花费的时间是一定的。这使得从函数快速返回QList成为可能。如果共享实例被修改,它将被复制(写时复制),这需要线性时间。
另请参阅operator =()。
QList::QList()
构造一个空列表。
QList &QList::operator=(QList &&other)
将other移动到此QList实例。此函数在Qt 5.2中引入。
QList &QList::operator=(const QList &other)
将other分配给该列表,并返回对该列表的引用。
QList::~QList()
销毁该列表。对列表中的值的引用以及此列表的所有迭代器均成为无效迭代器。
void QList::append(const T &value)
在列表末尾插入value 。
例如:

这与list.insert(size(),value)相同。
如果不共享此列表,则此操作通常非常快(分摊的固定时间),因为QList在其内部缓冲区的两侧预分配了额外的空间,以允许在列表的两端快速增长。
另请参见operator <<(),prepend()和insert()
void QList::append(const QList &value)
这是一个重载函数。将value列表的项目追加到此列表。此函数在Qt 4.5中引入。
另请参见operator <<()和operator + =()
const T &QList::at(int i) const
返回列表中索引位置i处的项目。i必须是列表中的有效索引位置(即0 <= i <size())。此函数非常快(恒定时间)。
另请参见value()和operator
T &QList::back()
提供此函数是为了实现STL兼容性。它等效于last()。该列表一定不能为空。如果列表可以为空,请在调用此函数之前调用isEmpty()。
const T &QList::back() const
这是一个重载函数。
QList::iterator QList::begin()
返回一个STL样式的迭代器,该迭代器指向列表中的第一项。另请参见constBegin()和end()。
QList::const_iterator QList::begin() const
这是一个重载函数。
QList::const_iterator QList::cbegin() const
返回指向列表中第一项的const STL样式的迭代器。
此函数在Qt 5.0中引入。
另请参见begin()和cend()。
QList::const_iterator QList::cend() const
返回一个const STL样式的迭代器,该迭代器指向列表中最后一个项目之后的虚拟项目。
此函数在Qt 5.0中引入。另请参见cbegin()和end()
void QList::clear()
从列表中删除所有项目。
另请参见removeAll()
QList::const_iterator QList::constBegin() const
返回指向列表中第一项的const STL样式的迭代器。
另请参见begin()和constEnd()。
QList::const_iterator QList::constEnd() const
返回一个const STL样式的迭代器,该迭代器指向列表中最后一个项目之后的虚拟项目。
另请参见constBegin()和end()
const T &QList::constFirst() const
返回对列表中第一项的const引用。该列表一定不能为空。如果列表可以为空,请在调用此函数之前调用isEmpty()。
此函数在Qt 5.6中引入。
另请参见constLast(),isEmpty()和first()
const T &QList::constLast() const
返回对列表中最后一项的引用。该列表不能为空。如果列表可以为空,请在调用此函数之前调用isEmpty()。
此函数在Qt 5.6中引入。
另请参见constFirst(),isEmpty()和last()
bool QList::contains(const T &value) const
如果列表包含出现的value,则返回true;否则返回false。此函数值的类型支持operator ==()。
另请参见indexOf()和count()
int QList::count(const T &value) const
返回列表中value出现的次数。此函数值的类型支持operator ==()。
另请参见contains()和indexOf()
int QList::count() const
返回列表中的项目数。此函数实际上与size()用法相同。
QList::const_reverse_iterator QList::crbegin() const
以相反的顺序返回指向列表中第一项的const STL样式的反向迭代器。
此函数在Qt 5.6中引入。
另请参见begin(),rbegin()和rend()
QList::const_reverse_iterator QList::crend() const
以相反的顺序返回一个const STL样式的反向迭代器,该迭代器指向列表中最后一项之后的一个。
此函数在Qt 5.6中引入。
另请参见end(),rend()和rbegin()
bool QList::empty() const
提供此函数是为了实现STL兼容性。它等效于isEmpty(),如果列表为空,则返回true。
QList::iterator QList::end()
样式迭代器,它指向列表中最后一个项目之后的虚拟项。
另请参见begin()和constEnd()。
QList::const_iterator QList::end() const
这是一个重载函数
bool QList::endsWith(const T &value) const
如果此列表不为空并且其最后一项等于value,则返回true;否则,返回false。
此函数在Qt 4.5中引入。
另请参见isEmpty()和contains()
QList::iterator QList::erase(QList::iterator pos)
从列表中删除与迭代器pos关联的项目,并将迭代器返回到列表中的下一项(可能是end())。
另请参见insert()和removeAt()
QList::iterator QList::erase(QList::iterator begin, QList::iterator end)
这是一个重载函数。从开始到(但不包括)结束删除所有项目。返回一个迭代器,该迭代器返回调用之前结束的同一项。
T &QList::first()
返回对列表中第一项的引用。该列表不能为空。如果列表为空,请在调用此函数之前调用isEmpty()。
另请参见constFirst(),last()和isEmpty()
const T &QList::first() const
这是一个重载函数
T &QList::front()
提供此函数是为了实现STL兼容性。它等效于first()。该列表不能为空。如果需要列表为空,请在调用此函数之前调用isEmpty()。
const T &QList::front() const
这是一个重载函数
int QList::indexOf(const T &value, int from = …) const
返回列表中第一个出现的value的索引位置,从索引位置from开始向前搜索。如果没有匹配项,则返回-1。
例如:

此函数值的类型支持operator ==()。请注意,QList使用基于0的索引,就像C ++数组一样。除上述值外,不支持负索引。
另请参见lastIndexOf()和contains()
void QList::insert(int i, const T &value)
将value插入列表中索引位置i处。如果i = size(),则将值附加到列表中。
例如:

另请参见append(),prepend(),replace()和removeAt()
QList::iterator QList::insert(QList::iterator before, const T &value)
是一个重载函数。将value插入到迭代器之前指向的项的前面。返回指向插入项的迭代器。注意,调用后传递给函数的迭代器将无效。应该使用返回的迭代器代替。
bool QList::isEmpty() const
如果列表不包含任何项,则返回true;否则,返回false。
另请参见size()
T &QList::last()
返回对列表中最后一项的引用。该列表不能为空。如果需要列表为空,请在调用此函数之前调用isEmpty()。
另请参见constLast(),first()和isEmpty()
const T &QList::last() const
这是一个重载函数
int QList::lastIndexOf(const T &value, int from = …) const
返回列表中最后一次出现的value的索引位置,从索引位置from开始向后搜索。如果from为-1(默认值),则搜索从最后一项开始。如果没有匹配项,则返回-1。
例如:

此函数值的类型支持operator ==()。
请注意,QList使用基于0的索引,就像C ++数组一样。除上述值外,不支持负索引。
另请参见indexOf()。
int QList::length() const
此函数与count()相同。
此函数在Qt 4.5中引入。
另请参见count()。
QList QList::mid(int pos, int length = -1) const
返回一个子列表,其中包括该列表中的元素(从位置pos开始)。如果length为-1(默认值),则包含pos中的所有元素;否则,将包括长度元素(如果长度少于元素,则包括所有其余元素)。
void QList::move(int from, int to)
将索引位置上的项从from移到索引位置to。
例如:

这与insert(to,takeAt(from))相同。此函数假定from和to都至少为0但小于size()。为避免失败,请测试from和to两者均至少为0且小于size()。
另请参见swap(),insert()和takeAt()。
void QList::pop_back()
提供此函数是为了实现STL兼容性。它等效于removeLast()。该列表不能为空。如果需要列表为空,请在调用此函数之前调用isEmpty()。
void QList::pop_front()
提供此函数是为了实现STL兼容性。它等效于removeFirst()。该列表不能为空。如果需要列表为空,请在调用此函数之前调用isEmpty()。
void QList::prepend(const T &value)
在列表的开头插入value。
例如:

这与list.insert(0,value)相同。
如果不共享此列表,此操作通常非常快(分摊的固定时间),因为QList在其内部缓冲区的两侧预分配了额外的空间,以允许在列表的两端快速增长。
另请参见append()和insert()
void QList::push_back(const T &value)
提供此函数是为了实现STL兼容性。它等效于append(value)。
void QList::push_front(const T &value)
提供此函数是为了实现STL兼容性。它等效于prepend(value)。
QList::reverse_iterator QList::rbegin()
以相反的顺序返回指向列表中第一项的STL样式反向迭代器。
此函数在Qt 5.6中引入。
另请参见begin(),crbegin()和rend()
QList::const_reverse_iterator QList::rbegin() const
这是一个重载函数。
此函数在Qt 5.6中引入。
int QList::removeAll(const T &value)
删除列表中所有出现的value并返回删除的条目数。
例如:

此函数值的类型支持operator ==()。
另请参见removeOne(),removeAt(),takeAt()和replace()。
void QList::removeAt(int i)
删除索引位置i处的项。i必须是列表中的有效索引位置(即0 <= i <size())。
另请参见takeAt(),removeFirst(),removeLast()和removeOne()
void QList::removeFirst()
删除列表中的第一项。调用此函数等效于调用removeAt(0)。该列表不能为空。如果列表为空,请在调用此函数之前调用isEmpty()。
另请参见removeAt()和takeFirst()
void QList::removeLast()
删除列表中的最后一项。调用此函数等效于调用removeAt(size()-1)。该列表不能为空。如果列表为空,请在调用此函数之前调用isEmpty()。
另请参见removeAt()和takeLast()
bool QList::removeOne(const T &value)
删除列表中第一个出现的value,并在成功时返回true;否则返回false。
例如:

此函数值的类型支持operator ==()。
此函数在Qt 4.4中引入。
另请参见removeAll(),removeAt(),takeAt()和replace()。
QList::reverse_iterator QList::rend()
以相反的顺序返回一个STL样式的反向迭代器,该迭代器指向列表中最后一项之后的一个。
此函数在Qt 5.6中引入。
另请参见end(),crend()和rbegin()
QList::const_reverse_iterator QList::rend() const
这是一个重载函数
此函数在Qt 5.6中引入。
void QList::replace(int i, const T &value)
用value替换索引位置i处的项目。i必须是列表中的有效索引位置(即0 <= i <size())。
另请参见operator 和removeAt()
void QList::reserve(int alloc)
为分配alloc元素保留空间。
如果alloc小于列表的当前大小,则不会发生任何事情。
如果您可以预测要添加多少个元素,请使用此函数避免重复分配QList内部数据。请注意,保留仅适用于内部指针数组。
此函数在Qt 4.7中引入。
int QList::size() const
返回列表中的项目数。
另请参见isEmpty()和count()。
bool QList::startsWith(const T &value) const
如果此列表不为空并且其第一项等于value,则返回true;否则,返回false。
此函数在Qt 4.5中引入。
另请参见isEmpty()和contains()
void QList::swap(QList &other)
交换other与此列表。此操作非常快,并且永远不会失败。
此函数在Qt 4.8中引入
void QList::swapItemsAt(int i, int j)
将索引位置i处的项目与索引位置j处的项目交换。此函数假定i和j都至少为0但小于size()。为避免失败,请测试i和j至少为0并小于size()。
例如:

Qt 5.13中引入了此函数。
另请参见move()。
T QList::takeAt(int i)
删除索引位置i处的项目并返回。i必须是列表中的有效索引位置(即0 <= i <size())。如果不使用返回值,则removeAt()会更有效。
另请参见removeAt(),takeFirst()和takeLast()
T QList::takeFirst()
删除列表中的第一项并返回。这与takeAt(0)相同。此函数假定列表不为空。为避免失败,请在调用此函数之前调用isEmpty()。
如果未共享此列表,则此操作将花费固定时间。
如果不使用返回值,则removeFirst()会更有效。
另请参见takeLast(),takeAt()和removeFirst()
T QList::takeLast()
删除列表中的最后一项并返回。这与takeAt(size()-1)相同。此函数假定列表不为空。为避免失败,请在调用此函数之前调用isEmpty()。
如果未共享此列表,则此操作将花费固定时间。
如果不使用返回值,则removeLast()会更有效。
另请参见takeFirst(),takeAt()和removeLast()
QSet QList::toSet() const
返回带有此QList中包含的数据的QSet对象。由于QSet不允许重复,因此生成的QSet可能小于原始列表。
例如:

注意:从Qt 5.14开始,范围构造函数可用于Qt的通用容器类,并且应代替此方法使用。
另请参见toVector(),fromSet()和QSet :: fromList()
std::list QList::toStdList() const
返回带有此QList中包含的数据的std :: list对象。
例如:

注意:从Qt 5.14开始,范围构造函数可用于Qt的通用容器类,并且应代替此方法使用。
另请参见fromStdList()和QVector :: toStdVector()
QVector QList::toVector() const
返回带有此QList中包含的数据的QVector对象。
例如:

注意:从Qt 5.14开始,范围构造函数可用于Qt的通用容器类,并且应代替此方法使用。
另请参见toSet(),fromVector()和QVector :: fromList()
T QList::value(int i) const
返回列表中索引位置i处的值。
如果索引i超出范围,则该函数将返回默认构造的值。
如果确定索引将在范围之内,则可以改用at(),它会稍快一些。
另请参见at()和operator
T QList::value(int i, const T &defaultValue) const
这是一个重载函数。如果索引i超出范围,则该函数返回defaultValue。
bool QList::operator!=(const QList &other) const
如果other不等于此列表,则返回true;否则,返回false。如果两个列表包含相同顺序的相同值,则认为它们相等。
此函数值的类型支持operator ==()。
另请参阅operator ==()
QList QList::operator+(const QList &other) const
返回一个列表,其中包含此列表中的所有项目,然后是other列表中的所有项目。
另请参阅operator + =()
QList &QList::operator+=(const QList &other)
将other列表的项目追加到此列表,并返回对该列表的引用。
另请参见operator +()和append()
QList &QList::operator+=(const T &value)
这是一个重载函数。将value附加到列表。
另请参见append()和operator <<()
QList &QList::operator<<(const QList &other)
将other列表的项目追加到此列表,并返回对该列表的引用。
另请参见operator + =()和append()
QList &QList::operator<<(const T &value)
这是一个重载函数。
将value附加到列表。
bool QList::operator==(const QList &other) const
如果other等于此列表,则返回true;否则,返回false。如果两个列表包含相同顺序的相同值,则认为它们相等。此函数值的类型支持operator ==()。
另请参见operator!=()
T &QList::operator[](int i)
返回索引位置i处的项目作为可修改的参考。i必须是列表中的有效索引位置(即0 <= i <size())。
如果在当前正在共享的列表上调用此函数,它将触发所有元素的副本。否则,此函数将以固定时间运行。
如果您不想修改列表,则应使用QList :: at()。
另请参见at()和value()
const T &QList::operator[](int i) const
这是一个重载函数。与at()相同。
此函数以固定时间运行。
Static Public Members 公共静态成员
[static]QList QList::fromSet(const QSet &set)
返回一个QList对象,其数据包含在set中。 QList中元素的顺序未定义。
例如:

注意:从Qt 5.14开始,范围构造函数可用于Qt的通用容器类,并且应代替此方法使用。
另请参见fromVector(), toSet(), and QSet::toList().
[static]QList QList::fromStdList(const std::list &list)
返回一个QList对象,列表中包含数据。 QList中元素的顺序与list中的顺序相同。
例如:

注意:从Qt 5.14开始,范围构造函数可用于Qt的通用容器类,并且应代替此方法使用。
另请参见toStdList()和QVector :: fromStdVector()。
[static]QList QList::fromVector(const QVector &vector)
返回带有向量中包含的数据的QList对象。
例如:

注意:从Qt 5.14开始,范围构造函数可用于Qt的通用容器类,并且应代替此方法使用。
另请参见fromSet(),toVector()和QVector :: toList()。
Related Non-Members 相关非成员
uint qHash(const QList &key, uint seed = …)
返回key的哈希值,使用seed为计算添加种子。
对于值类型T,此函数要求qHash()重载。
此函数在Qt 5.6中引入
bool operator<(const QList &lhs, const QList &rhs)
如果列表lhs在字典序小于rhs,则返回true;否则返回false。
此函数值的类型由operator <()实现。
此函数在Qt 5.6中引入。
QDataStream &operator<<(QDataStream &out, const QList &list)
写入list以进行流传输。
该函数值的类型需要由operator <<()实现。
另请参见QDataStream运算符的格式
bool operator<=(const QList &lhs, const QList &rhs)
如果列表lhs在字典序上小于或等于rhs,则返回true;否则,返回false。
此函数要求值类型具有operator (const QList &lhs, const QList &rhs)
如果列表lhs在字典序上大于rhs,则返回true;否则返回false。
此函数要求值的类型由operator =(const QList &lhs, const QList &rhs)
如果列表lhs在字典序上大于或等于rhs,则返回true;否则返回false。
此函数要求值的类型由operator >(QDataStream &in, QList &list)
从流中读取一个列表到(in)列表中。
此函数要求值的类型由operator >>()实现。
另请参见QDataStream运算符的格式。