QT 容器 QList,QLinkedList,QVector,QMap,QHash优缺点,与使用范围

【QT】容器类 Qt容器类的基本介绍,包括顺序类容器和关联容器类,针对每种容器的接口和基本用法做了说明 阅读详情

目录

一、前言:

二、QT 容器

2.1、简述

2.2、容器分类

1>、顺序容器:QList,QLinkedList,QVector,QStack 和 QQueue

2>、关联容器:QMap,QMultiMap,QHash,QMultiHash 和 QSet

2.3、QT 各容器简述

2.4、保存在 容器内的 值的类型 限制

1>、通用限制:

2>、个别容器 独有的限制:

三、 迭代器类

3.1、 Java 风格迭代器

1>、两种方法

2>、与 STL 风格迭代器不同①:

3>、与 STL 迭代器的不同②:

3.2、 STL 风格迭代器 - 比 Java 风格快

1>、两种方法:

2>、和 Java 风格迭代器不同

四、 隐式共享

4.1、优势:

4.2、劣势 - 可能出现错误

五、算法复杂度

5.1、线性容器类的算法复杂度

5.2、关联容器的算法复杂度

六、增长策略

6.1、各容器保存数据的方式:

6.2、增长方式

1>、QString 增长策略

2>、QVector 增长策略

3>、QHash 增长策略

4>、自定义调整 增长策略


一、前言:

如果想看 STL容器 的优缺点,请查看如下文章:

《C++ STL容器 底层数据结构》  https://blog.youkuaiyun.com/LearnLHC/article/details/89552420?spm=1001.2014.3001.5502

《c++ map、multimap 的使用方法》   https://blog.youkuaiyun.com/LearnLHC/article/details/89536774?spm=1001.2014.3001.5502

《QTL 容器 与 STL(1)- 写时复制》https://blog.youkuaiyun.com/LearnLHC/article/details/91983462

二、QT 容器

2.1、简述

这些类都是 隐式共享 和 可重入 的

隐式共享:仅在被写入时才被拷贝;仅读数据时,多个变量共享一块空间

可重入:首先它意味着这个函数可以被中断,其次意味着它除了使用自己栈上的变量以外不依赖于任何环境(包括static),这样的函数就是可重入,可以允许有多个该函数的副本在运行,由于它们使用的是分离的栈,所以不会互相干扰。反例:全局变量(如:static)

且针对几个方面做了优化:

一是速度,二是较低的内存占用,三是尽可能少的内联代码,减少生成程序的体积。

另外,在所有线程都以只读的方式访问容器时,这些类是线程安全的。

要遍历容器中的元素,你可以使用两种风格迭代器:

Java 风格迭代器和 STL 风格迭代器。

Java 风格迭代器有更好的易用性和更高级的函数,

而 STL 风格迭代器则在效率上会略有优势,并且可以用于 Qt 和 STL 提供的泛型算法中。

Qt 还提供了 foreach 关键字,可以方便地遍历容器。

2.2、容器分类

1>、顺序容器:QList,QLinkedList,QVector,QStack 和 QQueue

对于大多数的应用,QList 是最适用的。虽然其基于数组实现,但支持在头部和尾部快速插入。

如果确实需要一个基于链表的列表,你可以使用 QLinkedList。

如果要求元素以连续内存的形式保存,那么可以使用 QVector。

QStack 和 QQueue提供了 LIFO 和 FIFO 语义的支持。

2>、关联容器:QMap,QMultiMap,QHash,QMultiHash 和 QSet

"Multi" 容器可以方便地支持键值一对多的情形。

“Hash” 容器提供了快速查找的能力,这是通过使用哈希函数代替对有序集合进行二分查找实现的。

2.3、QT 各容器简述

类综述
QList这是目前使用最普遍的容器类,其保存了一个元素类型为T的列表,支持通过索引访问。QList 内部通过数组实现,以确保基于索引的访问足够快。
元素可以通过 QList::append() 和 QList::prepend() 插入到首尾,也可以通过 QList::insert() 插入到列表中间,和其他容器类不同的是,QList 为生成尽可能少的代码做了高度优化。QStringList 继承于 QList<QString>。
QLinkedList)这个类和 QList 很像,不同的是这个类使用迭代器进行而不是整形索引对元素进行访问。和 QList 相比,其在中间插入大型列表时其性能更优,而且其具有更好的迭代器语义。(在 QLinkedList 中,指向一个元素的迭代器只要该元素存在,则会一直保持有效,而在 QList 的迭代器则可能会在任意的元素插入或删除后失效。)
QVector这个类以数组的形式保存给定类型的元素,在内存中元素彼此相邻。在一个 vector 的头部或中部插入可能会相当慢,因为这可能会导致大量元素需要在内存中移动一个位置。
QVarLengthArray<T, Prealloc>这个类提供了一个底层的变长数组,在速度极其重要的情况下可以用来代替 QVector
QStack这个类继承于 QVector,用于为”后进,先出”(LIFO )提供便捷的语义支持。其为 QVector 添加了以下方法:QVector::push(),pop() 和 top()
QQueue这个类继承于 QVector,用于为”先进,先出”(FIFO )提供便捷的语义支持。其为 QVector 添加了以下方法:QList::enqueue(),dequeue() 和 head()
QSet这个类提供了一个单值数学集合,支持快速查找
QMap<Key, T>这个类提供了一个将类型为Key的键映射到类型为T的值的字典(关联数组)。通常情况下键值是一一对应的。QMap 根据Key进行排序,如果排序无关紧要,使用 QHash 代替速度会更快
QMultiMap<Key, T>这个类继承于 QMap,其为诸如键值一对多的多值映射提供了一个友好的接口
QHash<Key, T>这个类几乎与 QMap 有完全一致的 API ,但查找效率会有明显的提高。QHash 的数据是无序的。
QMultiHash这个类继承于 QMap,其为多值映射提供了一个友好的接口

2.4、保存在 容器内的 值的类型 限制

1>、通用限制:

保存在各个容器中的值类型可以是任意 可复制数据类型。

为了满足这一要求,该类型必须提供一个 复制构造函数 和一个 赋值运算符。

某些操作可能还要求类型支持默认构造函数。

对于大多数你想要在容器中保存的类型都满足这些要求,包括基本类型,如 int, double,指针类型,以及 Qt 数据类型,如 QString,QDate 和 QTime

但并不包括 QObject 及其子类(QWidget,QDialog,QTimer 等)。

如果你尝试实例化一个 QList<QWidget>,编译器将会抱怨道 QWidget 的复制构造函数和赋值运算符被禁用了。

如果需要在容器中保存这些类型的元素,可以 保存其指针,如 QList<QWidget *>。

例子 - 自定义数据类型

class Employee
{
public:
    Employee() {} //默认构造函数;
    Employee(const Employee &other); //拷贝构造函数;

    Employee &operator=(const Employee &other); //赋值操作符;

private:
    QString myName;
    QDate myDateOfBirth;
};

如果我们没有提供一个复制构造函数或一个赋值运算符,C++ 将会提供一个表现为逐个复制成员的默认实现。

在上面的例子中,默认行为就足够了。

同样的,如果没有提供默认构造函数,C++ 会提供一个默认构造函数,对成员进行默认构造。

尽管没有提供任何的构造函数或赋值运算符,下面的数据类型可以被保存于容器中。

struct Movie
{
    int id;
    QString title;
    QDate releaseDate;
};

2>、个别容器 独有的限制:

一些容器对它们所能保存的数据类型有额外的要求。

如:QMap<Key, T> 的键类型 Key 必须提供 operator<() 方法。

这些特殊要求在类的详细描述中有说明。在某些情况下,特定函数会有特定的要求,这在函数的描述中有说明。如果条件不满足,编译器将总是会报错。

Qt容器 提供了 operator<<() 和 operator>>(),因此这些类可以很方便地通过 QDataStream 进行读写。

这意味着存储在容器中的元素类型也必须支持 operator<<() 和 operator>>()

三、 迭代器类

Qt 容器类提供了两种风格迭代器:

Java 风格迭代器 和 STL 风格迭代器。

注意:

两种迭代器均会在容器中的数据 被修改 或 因调用非 const 成员函数,导致数据从 隐式共享 中分离后失效。

3.1、 Java 风格迭代器

1>、两种方法

对于每一个容器类,同时提供了两种数据类型的 Java 风格迭代器:一种支持只读访问,另一种支持读写访问。

容器只读迭代器读写迭代器
QList, QQueueQListIteratorQMutableListIterator
QLinkedListQLinkedListIteratorQMutableLinkedListIterator
QVector, QStackQVectorIteratorQMutableVectorIterator
QSetQSetIteratorQMutableSetIterator
QMap<Key, T>, QMultiMap<Key, T>QMapIterator<Key, T>QMutableMapIterator<Key, T>
QHash<Key, T>, QMultiHash<Key, T>QHashIterator<Key, T>QMutableHashIterator<Key, T>

2>、与 STL 风格迭代器不同①:

Java 风格迭代器 指向 的是元素 间隙 而不是元素本身。

因此,Java 风格迭代器可以指向容器最前(在第一个元素之前),也可以指向容器最后(在最后一个元素之后),还可以指向两个元素之间。

下图用红色箭头展示了一个四个元素的列表容器合法的迭代器位置。

3>、与 STL 迭代器的不同②:

Java 风格迭代器:对 remove() 方法的调用 不会导致迭代器的失效

 

3.2、 STL 风格迭代器 - 比 Java 风格快

1>、两种方法:

对于每一个容器类,同时提供了两种类型的 STL 风格迭代器:一种支持只读访问,另一种支持读写访问。

容器只读迭代器读写迭代器
QList, QQueueQList::const_iteratorQList::iterator
QLinkedListQLinkedList::const_iteratorQLinkedList::iterator
QVector, QStackQVector::const_iteratorQVector::iterator
QSetQSet::const_iteratorQSet::iterator
QMap<Key, T>, QMultiMap<Key, T>QMap<Key, T>::const_iteratorQMap<Key, T>::iterator
QHash<Key, T>, QMultiHash<Key, T>QHash<Key, T>::const_iteratorQHash<Key, T>::iterator

2>、和 Java 风格迭代器不同

STL 风格迭代器 直接指向元素本身

容器的 begin() 方法会返回一个指向容器第一个元素的迭代器,end() 方法返回的迭代器指向一个虚拟的元素,该元素位于容器最后一个元素的下一个位置。

end() 标记了一个非法的位置,永远不要对其解引用。

其通常被用作循环的结束条件。

对于空列表,begin() 和 end() 是相等的,因此我们永远不会执行循环。

下图用红色箭头展示了一个四个元素的列表容器中合法的迭代器位置。

四、 隐式共享

4.1、优势:

正是因为隐式共享,调用一个返回容器的函数的开销不会很大 (容器间拷贝)。

Qt API 中包含几十个返回值为 QList 或 QStringList 的函数(例如 QSplitter::sizes() )。

如果需要通过 STL 迭代器遍历这些返回值,你应当总是将返回的容器复制一份然后迭代其副本。例如:

// 正确
const QList<int> sizes = splitter->sizes();
QList<int>::const_iterator i;
for (i = sizes.begin(); i != sizes.end(); ++i)
    ...

// 错误
QList<int>::const_iterator i;
for (i = splitter->sizes().begin();
        i != splitter->sizes().end(); ++i)
    ...

如果函数返回的是一个容器的常量或非常量引用,那么是不存在这个问题的。

4.2、劣势 - 可能出现错误

隐式共享给 STL 风格迭代器带来了另一个后果是:

当一个容器的迭代器 在使用时 你应当避免复制该容器。

迭代器指向了一个内部结构,当你复制容器时你需要特别小心的处理迭代器。比如:

QVector<int> a, b;
a.resize(100000); // 创建一个填充0的大数组.

QVector<int>::iterator i = a.begin();
// 迭代器i的错误用法:
b = a;
/*
    现在我们应当小心地使用迭代器`i`,因为 i 指向的是共享的数据。
    如果我们执行 *i = 4 那么我们可能改变共享的实例(两个数组共享)
    这个行为和 STL 容器是不同的。在 Qt 中不要这样做。
*/

a[0] = 5;
/*
    容器 a 现在已经和共享数据脱离,
    即使 i 之前是容器 a 的迭代器,但现在它是作为 b 的迭代器而存在。
    此时 (*i) == 0
*/

b.clear(); // 此时 i 彻底失效

int j = *i; // 未定义行为!
/*
    b 中的数据(即i 指向的)已经被释放,
    在 STL 容器中这是有明确定义的((*i) == 5),
    但对于 QVector 来说这样做很有可能导致崩溃。
*/

五、算法复杂度

5.1、线性容器类的算法复杂度

 线性查找插入头部追加尾部追加
QLinkedListO(n)O(1)O(1)O(1)
QListO(1)O(n)Amort. O(1)Amort. O(1)
QVectorO(1)Amort. O(n)O(n)Amort. O(1)

表中的 “Amort. ” 表示“均摊行为”。

例如,“Amort. O(1)” 表示如果仅调用一次该方法,你可能耗费 O(n) 的时间,但如果多次调用(假设调用 n 次),平均下来复杂度将会是 O(1)。

 

5.2、关联容器的算法复杂度

 查找键 插入 
 平均最坏情况平均最坏情况
QMap<Key, T>O(log n)O(log n)O(log n)O(log n)
QMultiMap<Key, T>O(log n)O(log n)O(log n)O(log n)
QHash<Key, T>Amort. O(1)O(n)Amort. O(1)O(n)
QSetAmort. O(1)O(n)Amort. O(1)O(n)

对于 QVector,QHash 和 QSet,在尾部追加元素的时间复杂度均摊下来是 O(log n)。

但如果在插入元素之前以计划插入的元素个数 n 为参数调用 QVector::reserve(), QHash::reserve() 或 QSet::reserve(),复杂度将会降低至 O(1) 。

六、增长策略

6.1、各容器保存数据的方式:

QVector,QString 和 QByteArray 使用 连续内存 保存元素;

QList 维护了一个保存所有元素的指针(除非 T 本身是一个指针类型或一个指针大小的基本类型,这种情况下数组中保存的的是元素本身的值)的数组,用于提供基于索引的快速访问;

QHash<Key, T> 内部有一个和大小元素个数成正比的哈希表。

为了避免每次在尾部添加元素时重新分配内存,这些类通常会分配比实际需要要多的内存。

6.2、增长方式

1>、QString 增长策略

QString onlyLetters(const QString &in)
{
    QString out;
    for (int j = 0; j < in.size(); ++j) {
        if (in[j].isLetter())
            out += in[j];
    }
    return out;
}

我们通过每次追加一个字符的方式动态的构建了一个字符串。

假设我们追加 15000 个字符到这个 QString  字符串,接下来会在已分配内存耗尽时触发 QString 进行 18 次内存重新分配,

分别在已分配量为:4,8,12,16,20,52,116,244,500,1012,2036,4048,6132,8180,10228,12276,14324,16372时。

最后,这个 QString 占用了 16372 个 Unicode 字符的空间,其中 15000 个被实际使用了。

上面的数字可能有些奇怪,这里是分配的指导原则。

1、QString 每次分配 4 个字符指导达到 20 个字符。

2、从 20 到 4084 个字符,每次将当前的大小翻倍。更准确的说,是翻倍后再减去 12。

      一些内存分配器在分配刚好两倍的内存时性能较差,因为它们需要使用每块内存块中的一些字节用于登记。

3、从 4084 开始,每次分配将会在原来的基础上增加 2048 个字符大小(4096 字节)。

     这么做的意义是现代操作系统在重新分配内存时并不会复制全部的数据,而仅仅是简单地将物理内存页重新排序,只有第一页和最后一页的数据需要复制。

QByteArray 和 QList 使用和 QString 差不多的增长算法。

2>、QVector 增长策略

当数据类型支持通过 memcpy() 在内存中进行移动时(包括基本 C++ 类型,指针类型和 Qt 的隐式共享类),QVector 也使用相同的算法。

但在数据类型只支持通过复制构造函数和析构函数进行移动时则使用不同的算法:

在这种情况下,重新分配的开销会大的多,因此 QVector 将总是会在空间耗尽时直接申请两倍的内存,以减少重新分配的次数。

3>、QHash 增长策略

QHash<Key, T> 则是完全不同。

QHash 内部的哈希表每次增长两倍,每次增长时,保存的元素将会重新分配到一个通过 qHash(key) % QHash::capacity()(簇序号)计算出来的新的簇中。

此说明同样适用于 QSet 和 QCache<Key, T>。

4>、自定义调整 增长策略

对于大部分的应用,Qt 提供的增长策略完全可以满足需要。

如果你需要进行自定义调整,QVector, QHash<Key, T>, QSet, QString 和 QByteArray 提供了一个提供了三个方法用于检查和指定保存元素使用的内存量。

capacity() 用于返回已分配内存的元素个数(对于QHash 和 QSet,返回的是哈希表的簇的个数)。

reserve(size) 用于显式的预分配 size 个元素大小的内存。

squeeze() 用于释放所有没有用来保存元素的内存。

如果预先知道容器要保存元素的大概数量,可以提前调用 reserve() 方法分配内存,最后在填充完容器后,再调用 squeeze() 来释放多余的预分配内存。

 

QT容器类 QT不仅支持C++的STL模板库,同时自己也定义了一套容器类和与之操作的算法类,使用QT定义的这一套库,可以使在各个平台的表现相同。QT的这些容器被设计为更轻便,更安全和更容易使用。容器类是隐含共享(implicitly)的,可重入(reentrant)的和线程安全的。为容器遍历提供了两种迭代器(java-style,STL-style),并且QT提供了foreach关键字,更加方便元素遍历。 阅读详情

相关推荐

Qt中的容器类

容器类就类似STL中的容器,里面可以包含大多数的数据类型,基本类型和Qt的一些数据类型(QString、QDate和QTime等); Qt中的QObject以及其他的子类对象是不能够储存在容器中的;

m0_46408680的博客 1283

【QT学习五】Qt 的容器类QList,QVector,QSet,QMap等

它可以存储任何类型的对象,并提供了许多实用的函数来方便地访问和操作列表中的元素。QSet是一个集合,它存储不同的值,并提供了许多函数来方便地访问和操作集合中的元素。注意:存储在Qt容器中的数据必须是可赋值的数据类型,Qt的Object类以及其子类是不能够存储在容器中的,但可以存储其指针。优点:支持高效的随机访问,可以快速插入和删除元素,可以保持元素的顺序。优点:支持高效的随机访问,可以快速插入和删除元素,可以保持元素的顺序。优点:支持高效的查找,插入和删除元素,可以保持元素的唯一性。

从此不归路 2805

QT 容器类QList类、QLinkedList类和QVector类 QList类 QLinkedList类 QVector类 QMap类和QHash类 QMap类 QHash类 STL风格迭代器遍

QT提供了一组通用的基于模板的容器类。存储在QT容器类中数据必须是可赋值的数据类型,也就是说,这种数据类型必须提供一个默认的构造函数、一个复制构造函数和一个赋值操作运算符。这样的数据类型包含了通常使用的大多数数据类型,包括基本数据类型(如int和double等)和QT的一些数据类型(如QString、QDate和QTime等),但QT的QObject及其他的子类(如QWidget QDialog等)不能够存储在容器中,QObjectQT容器类是可以嵌套的。

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 463

容器类:QVector、QList、QSet、QMap使用

一、介绍 std中有几个常用的容器:vector、List、set、map,Qt中也封装了类似的容器。Qt 的容器类提供了隐式数据共享、不可变的特性,并且为速度做了优化,具有较低的内存占用量等。另外一点比较重要的,它们是线程安全的,且这些容器类是平台无关的 。 二、QVector 1、添加元素 QVector<int> intVec; intVec.append(10);......

darkGer的博客 1万+

验证QList线程安全性的小程序

申明:不是原创,不是原创,只是转载。 这是一个来自网上的例子 https://blog.youkuaiyun.com/conquerwave/article/details/50962548 (conquerwave的专栏) 用于测试QList的线程安全性,因原作者只给出源代码,没有给出测试结果,这里生成一个QT工程,打开即可编译,内部有ReadME.txt,简要说明

从零搭建ROS机械臂仿真环境:Ubuntu 20.04+Noetic下配置睿尔曼RM65的完整流程

本文详细介绍了在Ubuntu 20.04系统中,基于ROS Noetic搭建睿尔曼RM65机械臂的完整仿真环境。从环境准备、工作空间创建到MoveIt!配置与Gazebo仿真环境集成,提供了完整的流程和优化建议,帮助开发者高效实现机械臂仿真与调试。

v6b7n8m9q0的博客 933

QVector、QList、QLinkedList类用法区别

QVector、QList、QLinkedList类用法区别 1. QVector 是提供动态数组的一个模板类。 QList 是提供列表的一个模板类。 QLinkedList 是提供链表的一个模板类。 2. QVector<T> 是QT的一个通用容器类,它在相邻的内存位置中存储items的值,并且提供基于索引(index-based)的快速访问。 QList<T>...

《好好先生》专栏 1802

汽车级智能栅极驱动器深度解析 | 连载01:DRV871x-Q1系列产品架构与核心特性

集成度:单芯片集成多通道驱动器、电源管理、电流检测智能化:自适应控制算法,减少外部元件可靠性:多重保护机制,满足汽车级要求灵活性:SPI和硬件两种接口,适应不同应用需求。

VehSwHwDeveloper的博客 1153

Qt容器类

容器类 Qt的容器类比标准模板库中的容器类更轻巧安全和易于使用。并且是线程安全的,Qt的容器类的格式为:QList ,T 是一个具体的类型,可以是int、float等简单类型,也可以是Qstring、QDate等类型,但不能是QObject或任何其子类。T必须是一个可以赋值的类型。 Qt的容器类分为: 顺序容器 关联容器 顺序容器类: QList 最常用的容器类,以数组列表的方式实现,在其前和其后添加数据非常快,QList以下标索引的方式对数据进行访问。 QList用于添加、插入、替换、移动、删除、数据项

weixin_42105843的博客 1979

opencode完整使用指南:从安装配置到Agent式编程实战

AI编程工具正从辅助补全向智能体协作演进。编程智能体不仅理解项目全局,还能自主执行原子级重构、测试验证等工程任务,显著提升研发效能。以opencode为代表的开源终端AI编程工具,凭本地优先和灵活模型接入成为技术团队新宠。本文围绕opencode的完整使用链路展开,从Node.js环境准备、npm全局安装,到解决Windows环境变量配置问题,再到接入OpenAI、Anthropic或多模型管理平台,梳理一套标准化接入方案。同时演示VSCode插件调用、LSP语义分析及Playwright驱动的浏览器自动化

weixin_28837817的博客 319

[渗透测试实战篇-4] RCE漏洞组合拳突破Getshell全解析

本文深入解析RCE漏洞组合拳在渗透测试中的实战应用,通过SSRF、XXE等漏洞串联技术突破Getshell的全过程。文章详细介绍了Java和PHP环境下的漏洞利用差异,以及防御绕过与权限维持的实用技巧,为安全研究人员提供全面的实战指导。

weixin_29211309的博客 351

Qt中QVector 、QList、QSet、QMap比较

QVector、QList、QSet、QMap 和 QQueue 是 Qt 框架中常用的容器类,它们在存储和组织数据上有一些区别。

aoxuestudy的专栏 4325

永磁同步电机FOC控制实战:如何用线性死区补偿解决低速抖动问题(附Matlab仿真代码)

本文详细介绍了永磁同步电机FOC控制中线性死区补偿技术的工程实现方法,有效解决低速抖动问题。通过Matlab/Simulink仿真验证,该方案可将转矩脉动降低70%以上,显著提升系统稳定性。文章包含完整的数学模型构建、Simulink实现步骤及参数整定技巧,为工程师提供实用解决方案。

weixin_30872499的博客 154

QList、QVector、QMap、QHash安全删除(指定删除、遍历删除、快速删除)

指定删除(方法二,使用迭代器)全部删除(方法二,使用迭代器)指定删除(方法二,使用迭代器)全部删除(方法二,迭代器删除)

weixin_43246170的博客 1万+

SpringDoc 基本使用指南

SpringDoc 凭借零配置启动注解简洁和深度兼容 Spring 生态的优势,已成为 Spring Boot API 文档的首选工具。自动化- 减少手动维护文档的成本;标准化- 严格遵循 OpenAPI 3 规范;可扩展- 分组、安全控制灵活适配复杂项目。访问即可查看交互式文档(默认路径)

墨鸦的博客 1万+

Ubuntu20.04安装Eigen3.3.7、模板类Sophus和Ceres

Sophus的使用必须依赖3.3以上的Eigen版本。如果版本太低,Sophus库将无法安装使用。

qq_62964142的博客 3422

Qt常用容器汇总[QStringList | QList | QLinkedList | QVector | QMap | QHash]

Qt容器

星辰的博客 2838

《UDS协议从入门到精通》系列——图解0x23:通过地址读取内存

如何读取ECU中指定内存地址的数据?图解UDS 0x23服务带你快速上手!!

车载系统攻城狮 2623

遍历qvector_Qt 中的数据结构类(2)QList、QLinkedList、QVector、 QMap、QHash

迭代器QT支持两种类型的迭代器只读迭代器:const_iterator读写迭代器:iterator只读迭代器比读写迭代器操作速度快很多一、QList概念:是一个提供列表的模板类//函数:insert();//指定索引处插入值replace();//指定索引处替换值append();//尾追prepend();//头追at()://得到索引索引的值count();//返回某元素的个...

weixin_35367645的博客 1575

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Qt容器类QList、QLinkedList和QVector类

QList< T >是迄今为止最常用的容器类,它储存给定数据类型T的一系列数值,相对于其他Qt容器类,QList被高度优化。QList< T >维护了一个指针数组,该数组存储的指针指向QList< T >存储的列表项的内容。因此它提供了基于下标的快速访问。 对于不同的数据类型,QList采取不同的存储策略: 如果T是一个指针类型或指针大小的基本类型(即该类型所占的字节数和指针类型所占的字节数相同),QList会直接将数值存储在它的数组中。 如果存储对象的指针,则该指针指

DayDayUp 1295

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【嵌入式——QT】容器类

嵌入式-QT-容器类

weixin_39723539的博客 2899

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Qt扫盲-Qt容器之容器总述

总述 Qt提供了通用的基于模版实现方式的容器类:能做到通用性很大程度上就是依靠 模板 特性。容器本身就是为了存储数据的,但是这里的数据主要是在程序运行时,存储在内存中的数据,运行结束后就释放内存了。 Qt的内置容器特点:轻便、线程安全、相对于STL更容易使用。 Qt的容器是隐式共享的,它们是可重入的,并且它们针对速度、低内存消耗和最小的内联代码扩展进行了优化,从而产生了更小的可执行文件。此外,在它们被用于访问它们的所有线程用作只读容器的情况下,它们是线程安全的。 Qt支持两种访问容器数据的方式,提供了 Ja

洪源兄 5204

Qt 容器类整理与使用

QList详细介绍QList是Qt框架中的一个重要的泛型容器类,它是动态数组的实现,但是它的内部实现并不是简单的连续内存区域,而是根据元素大小和数量选择最优的存储策略(可能是数组或者链表)。这意味着QList能够灵活地应对不同场景下的需求,尤其是在元素较小或者大量元素已预先分配空间的情况下,它会尽可能地利用连续内存来加速随机访问。特点与功能模板类:QList是一个模板类,可以存储任何QObject派生类或者其他POD类型的数据。动态性:QList的大小可以在运行时动态调整,可以随时添加或移除元素。

CHNIM的博客 2307

QT中的 容器(container)

只要是数据就必须使用容器,程序中容器中的数据更方便增删改查 Qt中提供了一组通用的基于模板的容器类(container class)。可以用来存储指定的项目(items),如QVector(QString),与STL(C++标准模板库)相比,Qt中的容器更轻量,更安全,耿荣翻译使用 遍历容器 要遍历存储在容器中的项,可以使用两种类型的迭代器之一:java风格的迭代器和stl风格的迭代器。java...

aoxixi的博客 1万+

QT开发应用程序(4)-- 容器类(QList, QLinkedList, QVector, QMap, QHash)

QList、QLinkedList、QVector QList、QLinkedList和QVector提供的操作相似,用QList就可以代替其它两个,QList比QVector更快。元素的储存位置彼此相邻时使用QVector。 QList list; list << “1” << “2” << “3”; // list: [“1”, “2”, “3”] for...

x879014419的博客 700

qt 数据容器 详解

Qt提供的这些容器类各有特点,开发者在选择时需要根据具体需求考虑数据的访问模式、存储需求以及性能要求等因素。同时,Qt容器类还提供了隐式共享、线程安全性等特性,进一步提高了使用的便利性和效率。Qt容器类主要包括QList、QVector、QMap、QHash、QSet、QPair等,它们都是模板类,可以支持不同的数据类型。此外,还有一些基于这些模板类的类型别名,如QStringList(即QList)等。QList和QVector这两个类都是模板类,用于存储动态数组。

xie__jin__cheng的博客 1850
上一篇: Qt 中 无法根据鼠标移动事件(mouseMoveEvent 无效)
下一篇: 有人推荐使用 C++前置声明,有人不推荐使用,理由在哪?
LearnLHC
博客等级 码龄10年 183粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值