• QList类迭代器详解


    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 另请参见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 另请参见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 另请参见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 另请参见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 如果在当前正在共享的列表上调用此函数,它将触发所有元素的副本。否则,此函数将以固定时间运行。
    如果您不想修改列表,则应使用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运算符的格式。

  • 相关阅读:
    关于Linux中作业调度 crond 和 systemd.timer 使用场景的一些笔记
    Java相关的序列化与反序列化
    多疑型性格的危害,如何改变多疑型性格?
    Linux系统下的redis集群模式
    xxl-job架构原理讲解
    CSS 样式优先级
    SpringCloud 微服务全栈体系(十五)
    数据恢复篇:如何在 Android 手机上恢复未保存/删除的 Word 文档
    OpenCV每日函数 结构分析和形状描述符(8) fitLine函数 拟合直线
    Java校招120道面试题目合集
  • 原文地址:https://blog.csdn.net/u011555996/article/details/128036527