-
2021-03-31 18:33:51
QVector<int> oneEventTotal; oneEventTotal = {1,2,3,4,5,6,7,8,9,10}; auto eventTotal = 0; QVector<int>::iterator iter; for (iter=oneEventTotal.begin();iter!=oneEventTotal.end();iter++) { int k = eventTotal += *iter; qDebug() << k << "\0"; }
更多相关内容 -
QT 如何遍历序列容器(QVector|QMap|...)
2022-01-19 14:57:23QHash,QMultiHash QHashIterator< T > QMutableHashIterator< T > 以QVector为例,只读遍历的demo代码如下: QVector<QString> vct = {"A","B","C","D","E"}; QVectorIterator<QString> itr(vct); while (itr....QT提供了两种风格的遍历器:Java 和 STL
一、Java风格遍历器
Java 风格的遍历器是 Qt 首先推荐使用的形式。这种风格比起 STL 风格的遍历器更方便。方便的代价就是不如后者高效。Java 风格的遍历器指向的是两个元素之间的位置,而不是指向元素本身。因此,它们可能会指向集合第一个元素之前的位置,也可能指向集合的最后一个元素之后的位置。每一种容器都有两种 Java 风格的遍历器:一种提供只读访问,一种提供读写访问:
容器类型 只读访问 读写访问 QList< T >,QQueue< T > QMutableListIterator< T > QMutableListIterator< T > QLinkedList< T > QLinkedListIterator< T> QMutableLinkedListIterator< T > QVector< T >,QStack< T > QVectorIterator< T> QMutableVectorIterator< T > QSet< T> QSetIterator< T > QMutableSetIterator< T> QMap<Key, T>,QMultiMap<Key, T> QMapIterator< T > QMutableMapIterator< T > QHash<Key, T>,QMultiHash<Key, T> QHashIterator< T > QMutableHashIterator< T > - 以QVector为例,只读遍历的demo代码如下:
QVector<QString> vct = {"A","B","C","D","E"}; QVectorIterator<QString> itr(vct); while (itr.hasNext()) { qDebug() << "itr.next()=" << itr.next(); }
输出结果如下:
itr.next()= "A" itr.next()= "B" itr.next()= "C" itr.next()= "D" itr.next()= "E"
如果需要修改其中容器的值,代码如下:
QVector<QString> vct = {"A","B","C","D","E"}; QMutableVectorIterator<QString> mitr(vct); while (mitr.hasNext()) { if (mitr.next() == "C") { mitr.setValue("v"); } }
- QMap的遍历也是类似
QMap<int, QString> map; map.insert(1, "Apple"); map.insert(2, "Banana"); map.insert(3, "Cherry"); map.insert(4, "Grape"); QMapIterator<int, QString> itr(map); while (itr.hasNext()) { if (itr.next().key() < 3) qDebug() << itr.value(); }
二、STL风格遍历器
STL 风格的遍历器能够兼容 Qt 和 STL 的通用算法,并且为速度进行了优化。Qt 也提供了两种 STL 风格的遍历器:一种是只读访问,一种是读写访问。推荐尽可能使用只读访问,因为它们要比读写访问的遍历器更快。
容器 只读遍历器 读写遍历器 QList< T>,QQueue< T> QList< T>::const_iterator QList< T>::iterator QLinkedList< T> QLinkedList< T>::const_iterator QLinkedList< T>::iterator QVector< T>,QStack< T> QVector< T>::const_iterator QVector< T>::iterator QSet< T> QSet< T>::const_iterator QSet< T>::iterator QMap<Key, T>,QMultiMap<Key, T> QMap<Key, T>::const_iterator QMap<Key, T>::iterator QHash<Key, T>,QMultiHash<Key, T> QHash<Key, T>::const_iterator QHash<Key, T>::iter - QList遍历
QList<QString> lst; lst << "Apple" << "Banana" << "Cherry" << "Grape"; QList<QString>::iterator itr = lst.begin(); for (itr; itr != lst.end(); ++itr) { qDebug() << *itr; }
- QMap遍历
QMap<int, QString> map = { {1, "Apple"}, {2, "Banana"}, {3, "Cherry"} }; QMap<int, QString>::const_iterator citr = map.constBegin(); for (citr; citr != map.constEnd(); ++citr) { qDebug() << citr.key() << ":" << citr.value(); }
输出结果如下:
1 : "Apple" 2 : "Banana" 3 : "Cherry"
-
转:Qt 之 QVector
2020-12-24 13:14:42QVector类是一个提供动态数组的模板类。QVector是Qt普通容器类的一种。它将自己的每一个对象存储在连续的内存中,可以使用索引号来快速访问它们。QList、QLinkedList和 QVarLengthArray也提供了相似的功能,它们使用...QVector类是一个提供动态数组的模板类。
QVector是Qt普通容器类的一种。它将自己的每一个对象存储在连续的内存中,可以使用索引号来快速访问它们。QList、QLinkedList和 QVarLengthArray也提供了相似的功能,它们使用方法如下:
l QList一般用得最多,它能满足我们绝大部分需求。像prepend()和insert()这样的操作通常比QVector要快些,这是由于QList存储它的对象的方式(Algorithmic Complexity)不同。还有它基于索引的API比QLinkedList的基于迭代器的API更方便使用。最后,执行程序时它的代码扩展量更少些。
l QLinkedList,当你需要使用一个真正的链表,要求在恒定的时间内将对象插入到列表的中间,你更想用迭代器而不是索引号来访问对象,这个时候就使用QLinkedList吧!
l QVector,如果你想要在连续的内存上存储你的对象,你的对象比指针还要大,你想避免单独地把对象插入到堆的头部时,使用QVector。
l QVarLengthArray,如果你想要一个低层次的可变大小的容器,QVarLengthArray就足够了,它的优点是速度快!
下面是使用QVector存放整型值和QString的例子:
1
QVector integerVector;
2
QVector stringVector;
QVector保存对象的向量容器,通常是使用初始大小来创建向量容器。举例,下面的代码构造了一个拥有200个元素的QVector:
QVector vector(200);
1
如果所创建的向量容器对象没有赋初值,就会被使用这个向量容器的类的默认构造函数进行初始化。基本类型和指针类型都会被初始化为0,如果想使用其它的初值来初始化对象时,可以在初始化时再添加一个参数:
QVector vector(200,"Pass");
1
你也可以调用fill()函数在任何时候填充向量容器。 就像C++的数组一样,QVector的索引号也是从0开始的。使用索引号来访问对象时,可以这样operator
if (vector[0] == "Liz")
vector[0] ="Elizabeth";
1
2
如果只是读取向量容器的对象,可以调用at()函数来访问对象:
for (int i = 0; i < vector.size(); ++i)
{
if (vector.at(i) =="Alfonso")
cout << "FoundAlfonso at position " << i << endl;
}
1
2
3
4
5
调用at()函数来读取对象会比使用operator读取速度更快,因为这不会使用深度复制(deep copy)。
调用data()函数也可以访问保存在QVector的数据。这个函数会返回指向向量容器的第一个对象的指针。这样,你就可以使用指针来访问和修改向量容器内的对象。你可以使用指针将一个QVector向量容器传递给接收普通C++数组的函数。
你可以使用indexOf()和lastIndexOf()来查找某个对象出现的次数。前者从给定的位置向前搜索,后者是向后搜索。如果查找到了它们就返回相应的索引号,否则就返回-1,举例:
int i = vector.indexOf("Harumi");
if (i != -1)
cout << "Firstoccurrence of Harumi is at position " << i << endl;
1
2
3
contains()函数是用来查找向量容器内是否含有某个对象。
count()函数可以找出某个对象出现的次数。
insert(), replace(), remove(), prepend(), append()可以用来添加,移动和删除某个对象。对于体积较大的向量容器,除了append()和replace()这两个函数外,其它函数会比较慢,因为在内存中移动一个位置时,这些函数会使向量容器内的对象要移动许多次!如果你想要一个能够在中部快速插入和删除的容器时,可以使用QList或者QLinkedList。
resize()函数可以在任何时候改变QVector向量容器的体积。如果新的向量容器体积比以前的要大,QVector也许需要重新分配整个向量容器。QVector会预先分配两倍于实际数据的大小空间,从而减少再分配的次数。
reserve()函数,如果你事先知道向量容器大概包含多少个对象,你可以调用这个函数来预先分配一定的内存大小空间。
capacity()函数会告诉你向量容器所占内存的实际大小空间。
提醒:使用常量运算符和函数时会使QVector进行深度复制,这是隐含共享机制造成的。QVector的值的类型必须是可分配数据类型(assignable data type)。大多数数据类型都是这种类型。但是编译器不会让你存储一个QWidget,但是你可以存储QWidget指针啊!少数函数有额外的要求,比如indexOf()和lastIndexOf()期望值的类型可以支持operator==(),这些特殊要求在相关函数的文档上都有记录。
就像其它容器类一样,QVector支持Jave风格(QVectorIterator和QMutableVectorIterator)和STL风格的迭代器,实际上这些都很少使用,你可以使用索引号啊!
QVector不能插入、添加、替换一个QVector,否则你的应用程序就会报错!
QT,QVector 基本用法,遍历
QVector,是Qt对所有数组的封装,比如我们想要一个int类型数组,我们原先会写int array[10],我们在Qt里可以写QVector array(10),赋值的时候,我们依然可以照旧array[5]=4;想获取某一项的值也还可以array[9],也就是说,原来的特性我们还可以用。
那么QVector有什么好处呢?我们可以用count函数获知数组中有多少个元素,方便遍历,原先我们必须预定义好大小,而用QVector我们虽然最好也先定义好大小,但是预先不定义也可以。我们可以使用append函数或者< 添加元素: QVector strArray; strArray.append("Hello"); //可以这样 strArray<::iterator iter; for (iter=strArray.begin();iter!=strArray.end();iter++) { qDebug() << *iter << "\0"; } 插入: strArray.insert(1,"这就是在hello和world之间添加");删除: strArray.remove(1); //删除第一个元素,从0开始 strArray.remove(1,3); //从1开始,删除3个元素复制(取代): strArray.replace(1,"LEO"); //删除第一个元素,从0开始上述,除了append()和replace()这两个函数外,其它函数会比较慢,因为在内存中移动一个位置时,这些函数会使向量容器内的对象要移动许多次!如果你想要一个能够在中部快速插入和删除的容器时,可以使用QList或者QLinkedList。
调用at()函数来读取对象会比使用operator[]()读取速度更快,因为这不会使用深度复制(deep copy)。
调用data()函数也可以访问保存在QVector的数据。这个函数会返回指向向量容器的第一个对象的指针。这样,你就可以使用指针来访问和修改向量容器内的对象。你可以使用指针将一个QVector向量容器传递给接收普通C++数组的函数。
contains()函数是用来查找向量容器内是否含有某个对象。
count()函数可以找出某个对象出现的次数。
resize()函数可以在任何时候改变QVector向量容器的体积。如果新的向量容器体积比以前的要大,QVector也许需要重新分配整个向量容器。QVector会预先分配两倍于实际数据的大小空间,从而减少再分配的次数。
reserve()函数,如果你事先知道向量容器大概包含多少个对象,你可以调用这个函数来预先分配一定的内存大小空间。
capacity()函数会告诉你向量容器所占内存的实际大小空间。
-
顺序储存容器QVector | 学步园
2021-01-17 04:41:51在内存中 QVector的存储类似下图(出自C++ GUI Programming with Qt4, 2nd Edition): 同STL的vector类类似,QVector也提供了[]的重载,我们可以使用[]赋值: QVector > v(2); v[0] = 1.1; v[1] = 1.2; 如果实现不...容器Containers,有时候也被称为集合collections,指的是能够在内存中存储其他特定类型的对象的对象
,这种对象一般是通用
的模板类。C++提供了一套完整的解决方案,成为标准模板库Standard Template Library,也就是我们常说的STL。
Qt提供了它自己的一套容器类,这就是说,在Qt的应用程序中,我们可以使用标准C++的STL,也可以使用Qt的容器类。Qt容器类的好处在
于,它提供了平台无关的行为,以及隐式数据共享
技术。所谓平台无关,即Qt容器类不因编译器的不同而具有不同的实现;
所谓“隐式数据共享”,也可以称作“写时复制copy on
write”,这种技术允许在容器类中使用传值参数,而不会发生额外的性能损失。Qt容器类提供了类似Java的遍历器语法,同样也提供了类似STL的遍
历器语法,以方便用户选择自己习惯的编码方式。最后一点,在一些嵌入式平台,STL往往是不可用的,这时你就只能使用Qt提供的容器类,除非你想自己创
建。
今天我们要说的是“顺序储存容器”。所谓顺序存储,就是它存储数据的方式是一个接一个的,线性的。
第一个顺序存储容器是QVector,即向量。QVector是一个类似数组的容器,它将数据存储在连续
内存区域。同C++数组不同之处在于,QVector知道它自己的长度,并且可以改变大小。对于获取随机位置的数据,或者是在末尾处添
加数据,QVector的效率都是很高的,但是,在中间位置插入数据或者删除数据,它的效率并不是很高。在内存中
QVector的存储类似下图(出自C++ GUI Programming with Qt4, 2nd Edition):
同STL的vector类类似,QVector也提供了[]的重载,我们可以使用[]赋值:
QVector
> v(2);
v[0] = 1.1;
v[1] = 1.2;
如果实现不知道vector的长度,可以创建一个空参数的vector,然后使用append()函数添加数据:
QVector
> v;
v.append(1.1);
v.append(1.2);
在QVector类中,<
QVector
> v;
v << 1.1 << 1.2;
注意,如果QVector中的数据没有被显式地赋值,那么,数据项将使用加入类的默认构造函数进行初始化,如果是基本数据类
型和指针,则初始化为0.
QLinekdList是另外一种顺序存储容器。在数据结构中,这是一个链表,使用指针连接起所有数据。它的内存分布如下
(出自C++ GUI Programming with Qt4, 2nd Edition):
正如数据结构中所描述的那样,QLinkedList的优点是数据的插入和删除很快,但是随机位置值的访问会很慢。与
QVector不同,QLinkedList并没有提供重载的[]操作符,你只能使用append()函数,或
者<
QList是一个同时拥有QVector和QLinkedList的大多数有点的顺序
存储容器类。它像QVector一样支持快速的随机访问,重载了[]操作符,提供了索引访问的方式;它像
QLinkedList一样,支持快速的添加、删除操作。除非我们需要进行在很大的集合的中间位置的添加、删除操作,或者是需要所有元
素在内存中必须连续存储,否则我们应该一直使用Qlist。
QList有几个特殊的情况。一个是QStringList,这是
QList的子类,提供针对QString的很多特殊操作。QStack和
QQueue分别实现了数据结构中的堆栈和队列,前者具有push(), pop(),
top()函数,后者具有enqueue(), dequeue(), head()函数。具体情况请查阅API文档。
另外需要指出的一点是,我们所说的模板类中的占位符T,可以使基本数据类型,比如int,double等,也
可以指针类型,可以是类类型。如果是类类型的话,必须提供默认构造函数,拷贝构造函数和赋值操作符。Qt的内置类中的
QByteArray,QDateTime,QRegExp,QString和QVariant是满足这些条件的。但是,QObject的子类并不符合这
些条件,因为它们通常缺少拷贝构造函数和赋值操作符。不过这并不是一个问题,因为我们可以存储QObject的指针,而不是直接存储值。T也可以是一个容
器,例如:
QList
>
> list;
注意,在最后两个>之间有一个空格,这是为了防止编译器把它解析成>>操作符。这个空格是
必不可少的,切记切记!
下面我们来看一个类(出自C++ GUI Programming with Qt4, 2nd
Edition):
class
Movie
{
public
:
Movie(const
QString
&title = "", int
duration = 0);
void
setTitle(const
QString &title) { myTitle = title; }
QString title() const
{
return
myTitle; }
void
setDuration(int
duration) { myDuration = duration; }
QString duration() const
{ return
myDuration; }
private
:
QString myTitle;
int
myDuration;
};
我们能不能把这个类放进Qt容器类呢?答案是肯定的。下面我们来对照着前面所说的要求:第一,虽然这个类的构造函数有两个参数,但是这两个参数
都有默认值,因此,像Movie()这种写法是允许的,所以,它有默认构造函数;第二,这个类表面上看上去没有拷贝构造函数和赋值操作符,但是C++编译
器会为我们提供一个默认的实现,因此这个条件也是满足的。对于这个类而言,默认拷贝构造函数已经足够,无需我们自己定义。所以,我们可以放心的把这个类放
进Qt的容器类。
-
QT,QVector 基本用法,遍历[实例讲解]
2017-07-07 11:11:52本文讲述了QVector的基本使用方法,使初学者轻松上手,本文结合代码示例,能够使阅读者更加深刻的学习QVector的是用用方法。 -
Qt 中的数据结构类(2)QList、QLinkedList、QVector、 QMap、QHash
2021-01-14 09:11:15i { qDebug()二、QLinkedList 概念:是一个提供链接列表的模板类 三、QVector 概念:是一个提供动态数组的模板类 四、QMap 概念:提供了一个基于跳跃列表的字典//函数: insert(); //插入元素(推荐使用)。参数:1.... -
Qt C++ foreach怎么用 遍历容器中的元素 能否改变元素值 是否是浅拷贝
2020-06-28 15:51:00例如利用foreach遍历QVector中每个元素 class MyStruct{ public: int m_a = 0; int m_b = 0; QString m_str = ""; }; void main() { QVector<MyStruct> test_vector(3); test_vector[0].m_a = -
遍历vector二维数组
2020-02-09 12:53:22遍历vector二维数组的方法 下标遍历 vector<vector<int>> vec(5, vector<int>(6, 0)); int i,j; for (i = 0; i < vec.size(); i++) { for(j = 0; j < vec[i].size(); j++) cout <<... -
qt中QVector和vector以及QMap和map的遍历性能对比
2019-09-24 17:39:46使用Qt中的容器给C++开发...我就写了几个简单的遍历的例子,测试了QVector、vector等容器的那些方法效率更高。 测试环境: 系统:windows 10 编译器:MingGW mingw5.3.0 Qt版本:5.9.7 硬件:i7 8代,16G内存... -
Qt遍历容器删除
2021-06-16 17:59:53Qt遍历容器删除 用for循环的时候 类似:QVector<QString> strList; strList << "测试1" << "测试2" << "双撒发达" << "a第三方打撒从" << "测试3"; for (int i = 0; i <... -
Qt中的容器类 QList QLinkedList QVector..遍历及相关
2014-04-23 13:54:58QVector这个方式是在相邻的内存位置上保存数据的,也就是以数组的方式进行存储的,所以对起进行插入的操作的时候是一项很耗时间的,因为要有大量的数据进行一动。。当然也是可以通过下标对其进行访问的。 Qt的... -
QT中使用QVector存储QImage类型图像数据遍历时不显示问题
2021-08-26 15:23:01需求:从海康工业相机硬触发5次,获取5张QImage类型图像数据存储到QVector中,然后再分别显示到界面上,当保存5张QImage类型图像数据到QVector后,遍历QVector中数据时,图像在界面上一直不显示,或只显示最后一张... -
QList和QVector速度比较
2022-01-01 16:57:33测试QList和QVector的数据插入和删除的速度。 代码如下(示例): //以函数对象的形式定义查找规则--升序--MftNumber class ascendingOrder { public: bool operator()(const int& i, const int& j) { ... -
Qt入门教程【STL篇】QVector循环删除指针浅谈
2021-12-15 14:59:03QVector循环删除指针浅谈 -
论C++11 中vector的N种遍历方法
2019-11-12 13:33:43vector是经常要使用到的std组件,对于vector的遍历,本文罗列了若干种写法。(注:本文中代码为C++11标准的代码,需要在较新的编译器中编译运行) 假设有这样一个vector:(注意,这种列表初始化的方法是c++11中... -
Qt QVector简单用法
2018-08-22 13:21:47添加元素 QVector<QString&...遍历 QVector<QString>::iterator iter; for (iter = strArray.begin(); iter != strArray.end(); iter++) { qDebug() << *ite... -
【Qt】一文总结Qt序列式容器类—QVector
2022-03-16 21:35:08文章目录一、开篇二、QVector的使用方法三、QVector的重要成员函数API(3-1)使用at()成员函数访问QVector中的数据(3-2)使用data()成员函数访问QVector中的数据(3-3)查找向量中出现的所有特定值(3-4)对vector... -
Vector的遍历
2019-06-12 15:05:17通过迭代器遍历。即通过Iterator去遍历。 Integer value = null; int size = vec.size(); for (int i=0; i<size; i++) { value = (Integer)vec.get(i); } 随机访问,通过索引值去遍历。 由于Vector实现了... -
QT容器类(一) 之 QVector 、QLinkedList 和 QList | 学步园
2021-01-14 09:11:16例如,你需要一个可变长的QString的数组,你可以使用QVector, 相对于STL容器,Qt中这些容器类都是轻量级的,更安全,更容易使用,他们都是可重入的,更优化的性能,更低的内存消耗,最小的代码膨胀。你可以通过两种... -
嵌套QVector指针内存处理
2021-07-16 20:02:42The data comes either from file or buffer (if acquired live) and is stored as a nest qvector, ie: QVector < QVector > cVoxel; When an image is read from file, cVoxel is initialized using QVector....