精华内容
下载资源
问答
  • [QT]遍历QVector
    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";
        }
    
    更多相关内容
  • QHash,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_iteratorQList< T>::iterator
    QLinkedList< T>QLinkedList< T>::const_iteratorQLinkedList< T>::iterator
    QVector< T>,QStack< T>QVector< T>::const_iteratorQVector< T>::iterator
    QSet< T>QSet< T>::const_iteratorQSet< T>::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>::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:42
    QVector类是一个提供动态数组的模板类。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的存储类似下图(出自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):

    200912191261237298671.png

    同STL的vector类类似,QVector也提供了[]的重载,我们可以使用[]赋值:

    InBlock.gif

    QVector

    > v(2);

    InBlock.gif

    v[0] = 1.1;

    InBlock.gif

    v[1] = 1.2;

    如果实现不知道vector的长度,可以创建一个空参数的vector,然后使用append()函数添加数据:

    InBlock.gif

    QVector

    > v;

    InBlock.gif

    v.append(1.1);

    InBlock.gif

    v.append(1.2);

    在QVector类中,<

    InBlock.gif

    QVector

    > v;

    InBlock.gif

    v << 1.1 << 1.2;

    注意,如果QVector中的数据没有被显式地赋值,那么,数据项将使用加入类的默认构造函数进行初始化,如果是基本数据类

    型和指针,则初始化为0.

    QLinekdList是另外一种顺序存储容器。在数据结构中,这是一个链表,使用指针连接起所有数据。它的内存分布如下

    (出自C++ GUI Programming with Qt4, 2nd Edition):

    200912191261237772859.png

    正如数据结构中所描述的那样,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也可以是一个容

    器,例如:

    InBlock.gif

    QList

    >

    > list;

    注意,在最后两个>之间有一个空格,这是为了防止编译器把它解析成>>操作符。这个空格是

    必不可少的,切记切记!

    下面我们来看一个类(出自C++ GUI Programming with Qt4, 2nd

    Edition):

    InBlock.gifclass

    Movie

    InBlock.gif

    {

    InBlock.gifpublic

    :

    InBlock.gif

    Movie(const

    QString

    &title = "", int

    duration = 0);

    InBlock.gif

    InBlock.gif

    void

    setTitle(const

    QString &title) { myTitle = title; }

    InBlock.gif

    QString title() const

    {

    return

    myTitle; }

    InBlock.gif

    void

    setDuration(int

    duration) { myDuration = duration; }

    InBlock.gif

    QString duration() const

    { return

    myDuration; }

    InBlock.gif

    InBlock.gifprivate

    :

    InBlock.gif

    QString myTitle;

    InBlock.gif

    int

    myDuration;

    InBlock.gif

    };

    我们能不能把这个类放进Qt容器类呢?答案是肯定的。下面我们来对照着前面所说的要求:第一,虽然这个类的构造函数有两个参数,但是这两个参数

    都有默认值,因此,像Movie()这种写法是允许的,所以,它有默认构造函数;第二,这个类表面上看上去没有拷贝构造函数和赋值操作符,但是C++编译

    器会为我们提供一个默认的实现,因此这个条件也是满足的。对于这个类而言,默认拷贝构造函数已经足够,无需我们自己定义。所以,我们可以放心的把这个类放

    进Qt的容器类。

    展开全文
  • QT,QVector 基本用法,遍历[实例讲解]

    万次阅读 多人点赞 2017-07-07 11:11:52
    本文讲述了QVector的基本使用方法,使初学者轻松上手,本文结合代码示例,能够使阅读者更加深刻的学习QVector的是用用方法。
  • i { qDebug()二、QLinkedList 概念:是一个提供链接列表的模板类 三、QVector 概念:是一个提供动态数组的模板类 四、QMap 概念:提供了一个基于跳跃列表的字典//函数: insert(); //插入元素(推荐使用)。参数:1....
  • 例如利用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中的容器给C++开发...我就写了几个简单的遍历的例子,测试了QVector、vector等容器的那些方法效率更高。 测试环境: 系统:windows 10 编译器:MingGW mingw5.3.0 Qt版本:5.9.7 硬件:i7 8代,16G内存...
  • Qt遍历容器删除

    2021-06-16 17:59:53
    Qt遍历容器删除 用for循环的时候 类似:QVector<QString> strList; strList << "测试1" << "测试2" << "双撒发达" << "a第三方打撒从" << "测试3"; for (int i = 0; i <...
  • QVector这个方式是在相邻的内存位置上保存数据的,也就是以数组的方式进行存储的,所以对起进行插入的操作的时候是一项很耗时间的,因为要有大量的数据进行一动。。当然也是可以通过下标对其进行访问的。 Qt的...
  • 需求:从海康工业相机硬触发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) { ...
  • QVector循环删除指针浅谈
  • 论C++11 中vector的N种遍历方法

    千次阅读 2019-11-12 13:33:43
    vector是经常要使用到的std组件,对于vector的遍历,本文罗列了若干种写法。(注:本文中代码为C++11标准的代码,需要在较新的编译器中编译运行) 假设有这样一个vector:(注意,这种列表初始化的方法是c++11中...
  • Qt QVector简单用法

    千次阅读 2018-08-22 13:21:47
    添加元素 QVector&lt;QString&...遍历 QVector&lt;QString&gt;::iterator iter; for (iter = strArray.begin(); iter != strArray.end(); iter++) { qDebug() &lt;&lt; *ite...
  • 文章目录一、开篇二、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实现了...
  • 例如,你需要一个可变长的QString的数组,你可以使用QVector, 相对于STL容器,Qt中这些容器类都是轻量级的,更安全,更容易使用,他们都是可重入的,更优化的性能,更低的内存消耗,最小的代码膨胀。你可以通过两种...
  • The 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....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 917
精华内容 366
关键字:

遍历qvector

友情链接: VoiceUnvoice2.rar