精华内容
下载资源
问答
  • QVector

    千次阅读 2019-12-04 21:43:21
    目录 1、构造 2、增加 3、删除 4、改 ...QVector<int> vector; for(int i = 0; i < 10; ++i) vector << i + 1; //构造 QVector<int> myVector1(5); //开辟5个大小的...

    目录

    1、构造

    2、增加

    3、删除

    4、改

    5、查找

    6、取值

    7、转换

    8、其他

    9、测试代码


    1、构造

    QVector<int> vector;
    for(int i = 0; i < 10; ++i) vector << i + 1;
    
    //构造
    QVector<int> myVector1(5);      //开辟5个大小的空间
    QVector<int> myVector2(5,1);    //5个值,都是1
    QVector<int> myVector3(vector); //用另一个QVector初始化

    2、增加

    QVector<int> myVector;
    myVector.push_back(5);  //在数组后添加元素
    myVector.push_front(4); //在数组首位置添加元素
    myVector.prepend(3);    //在数组首位置添加元素
    myVector.append(6);     //在数组最后添加元素
    myVector << 7;          //在数组最后添加元素
    myVector.insert(0,2);   //在数组位置0,添加元素
    myVector.insert(0,2,1); //在数组位置0,添加2个值为1的元素
    myVector.insert(myVector.end(),8);      //在数组最后,添加元素
    myVector.insert(myVector.end(),2,9);    //在数组最后,添加2个值为9的元素
    qDebug() << myVector;

    3、删除

    //删除
    myVector.clear();
    myVector << vector;
    myVector.remove(0,2);   //从位置0开始,移除2个元素
    myVector.remove(0);     //移除位置0的元素
    qDebug() << myVector;
    myVector.pop_back();    //移除最后一个元素
    myVector.pop_front();   //移除第一个元素
    myVector.clear();
    myVector << vector;
    myVector.erase(myVector.begin());//移除某位置的元素
    myVector.erase(myVector.begin(),myVector.end());//移除区间所有元素
    qDebug() << myVector;

    4、改

    //改
    myVector.clear();
    myVector << vector;
    myVector.replace(0,10);//位置0上的元素,用10来代替
    qDebug() << myVector;

    5、查找

    qDebug() << myVector.indexOf(2,0);//从位置0开始,查找元素2,返回下标
    qDebug() << myVector.lastIndexOf(2,1);//从右向左数,位置0开始查找元素2,返回下标
    qDebug() << myVector.startsWith(2);//判断,第一个元素是否是2
    qDebug() << myVector.endsWith(2);//判断,最后一个元素是否是2

    6、取值

    qDebug() << myVector.front(); //第一个元素
    qDebug() << myVector.first(); //第一个元素
    qDebug() << myVector.last(); //最后一个元素
    qDebug() << myVector.mid(1,3); //取位置1后,3个元素

    7、转换

    //将QVector转为stdVector
    std::vector<int> stdVector = myVector.toStdVector();
    
    //将QVector转为QList
    QList<int> list = myVector.toList();
    qDebug() << list;
    
    //将stdVector转为QVector
    myVector.clear();
    myVector = QVector<int>::fromStdVector(stdVector);
    qDebug() << myVector;
    
    //将QList转为QVector
    myVector.clear();
    myVector = QVector<int>::fromList(list);
    qDebug() << myVector;

    8、其他

    myVector.squeeze(); //释放不需要存储项的内存
    qDebug() << myVector.data(); //首地址
    qDebug() << myVector.capacity(); //内存大小
    myVector.clear(); //清空内存

    9、测试代码

    #include <QCoreApplication>
    #include <QDebug>
    #include <list>
    #include <QVector>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        QVector<int> vector;
        for(int i = 0; i < 10; ++i) vector << i + 1;
    
        //构造
        QVector<int> myVector1(5);      //开辟5个大小的空间
        QVector<int> myVector2(5,1);    //5个值,都是1
        QVector<int> myVector3(vector); //用另一个QVector初始化
    
        //增加
        QVector<int> myVector;
        myVector.push_back(5);  //在数组后添加元素
        myVector.push_front(4); //在数组首位置添加元素
        myVector.prepend(3);    //在数组首位置添加元素
        myVector.append(6);     //在数组最后添加元素
        myVector << 7;          //在数组最后添加元素
        myVector.insert(0,2);   //在数组位置0,添加元素
        myVector.insert(0,2,1); //在数组位置0,添加2个值为1的元素
        myVector.insert(myVector.end(),8);      //在数组最后,添加元素
        myVector.insert(myVector.end(),2,9);    //在数组最后,添加2个值为9的元素
        qDebug() << myVector;
    
        //删除
        myVector.clear();
        myVector << vector;
        myVector.remove(0,2);   //从位置0开始,移除2个元素
        myVector.remove(0);     //移除位置0的元素
        qDebug() << myVector;
        myVector.pop_back();    //移除最后一个元素
        myVector.pop_front();   //移除第一个元素
        myVector.clear();
        myVector << vector;
        myVector.erase(myVector.begin());//移除某位置的元素
        myVector.erase(myVector.begin(),myVector.end());//移除区间所有元素
        qDebug() << myVector;
    
        //改
        myVector.clear();
        myVector << vector;
        myVector.replace(0,10);//位置0上的元素,用10来代替
        qDebug() << myVector;
    
        //查找
        qDebug() << myVector.indexOf(2,0);//从位置0开始,查找元素2,返回下标
        qDebug() << myVector.lastIndexOf(2,1);//从右向左数,位置0开始查找元素2,返回下标
        qDebug() << myVector.startsWith(2);//判断,第一个元素是否是2
        qDebug() << myVector.endsWith(2);//判断,最后一个元素是否是2
    
        //取值
        qDebug() << myVector.front(); //第一个元素
        qDebug() << myVector.first(); //第一个元素
        qDebug() << myVector.last(); //最后一个元素
        qDebug() << myVector.mid(1,3); //取位置1后,3个元素
    
        //转换
        //将QVector转为stdVector
        std::vector<int> stdVector = myVector.toStdVector();
    
        //将QVector转为QList
        QList<int> list = myVector.toList();
        qDebug() << list;
    
        //将stdVector转为QVector
        myVector.clear();
        myVector = QVector<int>::fromStdVector(stdVector);
        qDebug() << myVector;
    
        //将QList转为QVector
        myVector.clear();
        myVector = QVector<int>::fromList(list);
        qDebug() << myVector;
    
        myVector.squeeze(); //释放不需要存储项的内存
        qDebug() << myVector.data(); //首地址
        qDebug() << myVector.capacity(); //内存大小
        myVector.clear(); //清空内存
        return a.exec();
    }
    

     

    展开全文
  • QVector 的使用

    2020-09-17 13:25:28
    QVector

    QVector

    1.之前只用Qvector一直是.at(i) 取值,如果是更新值,也是用replace(int i, const T &value)来替换,走进了误区,觉得麻烦,所以潜心修炼看API,解决如下:

    用typedef自定义一个数据结构

    typedef struct _STUDENT
    {
       
        int id;
        int age;
        QString name;
        float score;
    }STUDENT;
    

    定义全局变量和函数

    QVector<STUDENT> students
    展开全文
  • 从本节课开始,将介绍Qt封装的几个常用数据结构模板类,本节先介绍数组类QVector。学过C++的人员都知道数组的成员在内存中是连续存放的,因此使用下标访问数组成员时效率是非常高的。但是当扩大数组容量时,有可能...

    本案例对应的源代码目录:src/chapter04/ks04_05。

        在软件研发过程中,数据结构是个无论如何也不能回避的话题。包括STL在内,很多第三方库都对常用数据结构进行了模板化封装。从本节课开始,将介绍Qt封装的几个常用数据结构模板类,本节先介绍数组类QVector。学过C++的人员都知道数组的成员在内存中是连续存放的,因此使用下标访问数组成员时效率是非常高的。但是当扩大数组容量时,有可能需要重新申请内存,然后将旧的数组成员复制到新内存中,这会损失一些性能。所以如果经常对数据集进行插入、删除元素的操作,那么不建议使用数组。OK,回归正题,本节设计了3个场景来介绍QVector。

    (1)向QVector中添加成员并遍历。

    (2)向QVector中添加自定义类的对象。

    (3)向QVector中添加自定义类对象的指针。

    首先简单说一下课程附件代码。因为要用到命令行来接受用户输入,因此需要在pro中修改CONFIG参数项。

    CONFIG += console

    因为要用到QVector,所以请在文件开头增加对<QVector>的包含语句。

    #include <QVector>

    下面分别看一下这3个场景的案例。

    1.向QVector中添加成员并遍历

    在代码清单4-28中,将int类型的数据添加到QVector。如果把int换成Qt的类,代码也类似。

    代码清单4-28

    /**

    * @brief  向QVector添加成员并遍历。

    * @return

    */

    void example01(){                       

        // 添加成员

        QVector<quint32> vecId;

        vecId.push_back(2011);

        vecId.push_back(2033);

        vecId.push_back(2033);

        vecId.push_back(2042);

        vecId.push_back(2045);

        // push_front

        vecId.push_front(2046);

        ...

    }

    代码清单4-28中,建立了一个成员类型为quint32的数组。这是一个整数数组,数组名称为vecId。调用push_back()接口可以向数组中添加成员。push_back()的功能是将新加入的成员添加到数组的尾部,而push_front()接口则负责将成员添加到数组的首部,也就是下标为0的位置。可以将数组的成员打印到终端来印证这一点,见代码清单4-29。

    代码清单4-29

    // example01()

    // 遍历成员-使用下标

    cout << endl << "-------------- QVector ---------------" << endl;

    cout << "print members using index ......" << endl;

    int idxVec = 0;

    for (idxVec = 0; idxVec < vecId.size(); idxVec++) {

        cout << "    vecId[" << idxVec << "] =" << vecId[idxVec] << endl;

    }

    在代码清单4-29中,使用下标遍历数组的成员。语法同访问C++中的普通数组成员一样:数组名[下标]。另外,通过正序迭代器(简称迭代器)来访问数组成员也非常方便,见代码清单4-30。

    代码清单4-30

    // example01()

    // 遍历成员-使用迭代器(正序)

    cout << endl << "-------------- QVector ---------------" << endl;

    cout << "print members using iterator......" << endl;

    QVector<quint16>::iterator iteVec = vecId.begin();                              

    idxVec = 0;

    for (iteVec = vecId.begin(); iteVec != vecId.end(); iteVec++, idxVec++) {       

        cout << "    " << *iteVec << endl;                                           

    }

    代码清单4-30展示了正序访问数组的方法,即从下标0开始遍历到数组最后一个成员。为了使用迭代器遍历,需要先定义迭代器,并将其初始化为指向数组的开头(第一个成员),见标号①处。定义迭代器的语法是:数组类型::iterator,即QVector<quint16>::iterator。用来判断迭代器是否已经遍历完毕的代码是:iteVec  !=  vecId.end(),见标号②处。其中vecId.end()表示数组的结尾(并非数组的最后一个成员,而是最后一个成员的下一个位置,是真正的结尾)。当需要用迭代器访问数组成员时,可使用“*迭代器”的语法,比如标号③处的*iteVec。还可以通过倒序遍历数组成员,见代码清单4-31。

    代码清单4-31

    // example01()

    // 遍历成员-使用迭代器(倒序)

    cout << endl << "-------------- QVector ---------------" << endl;

    cout << "print members using reverse iterator......" << endl;

    QVector<quint32>::reverse_iterator reverseIteVec = vecId.rbegin();                   

    for (reverseIteVec = vecId.rbegin(); reverseIteVec != vecId.rend();reverseIteVec++) {

        cout << "    " << *reverseIteVec << endl;                                        

    }

    从代码清单4-31可以看出,倒序迭代器与正序迭代器并非同一个类型。倒序迭代器的类型为QVector<quint32>::reverse_iterator。在初始化时,倒序迭代器指向数组的倒数第一个成员vecId.rbegin(),见标号①处。用来判断倒序迭代器是否已经遍历完毕的代码是:reverseIteVec !=  vecId. rend(),见标号②处。其中vecId. rend()表示数组倒序的结尾(并非数组的第一个成员,而是指向其前一个位置)。当需要用倒序迭代器访问数组成员时,可使用“*迭代器”的语法,比如标号③处的* reverseIteVec。接下来,要到数组中查找某个成员,方法是使用STL的算法模板类algorithm,因此需要包含其头文件<algorithm>。

    下面看一下查找某个数组成员并且在它的前面插入另一个成员该怎么实现,如代码清单4-32所示。标号①处的std::find()是<altorithm>中的搜索算法,它需要3个参数。前两个参数分别表示要查找的范围,比如数组的开头和结尾,最后一个参数表示要查找的对象,比如2042这个数字。

    代码清单4-32

    // example01()

    ...

    // 查找&插入

    // 在2042之前插入数字:10000.

    iteVec = std::find(vecId.begin(), vecId.end(), 2042);                               

    if (iteVec != vecId.end()) {          // 找到了,此时iteVec指向2042。

        vecId.insert(iteVec, 10000);      // 在2042之前插入数字10000。

        cout << endl << "-------------- QVector ---------------" << endl;

        cout << "insert 10000 before 2042 in vector." << endl;

    }

    代码清单4-32表示,如果找到了则在找到的位置之前插入数字10000。insert()接口的功能是在指定迭代器之前插入一个成员。iteVec != vecId.end()表示迭代器未指向数组结尾,其含义是找到了需要查找的数字。代码清单4-33用来演示查找与删除数组中指定成员功能。

    代码清单4-33

    //  example01()

    ...

    // 查找&删除

    iteVec = std::find(vecId.begin(), vecId.end(), 2042);                               

    if (iteVec != vecId.end()) { // 找到了

        cout << "erase 2042 from vector." << endl;

        vecId.erase(iteVec);

    }

     

    代码清单4-33中的查找功能跟代码清单4-32一样。删除数组中指定成员的功能由erase()接口提供,该接口需要一个迭代器参数,可以用标号①处用查找接口返回的迭代器。有时候数组中存在多个相同成员,如果希望把它们都找到并从数组中删除该怎么做呢?见代码清单4-34。

    代码清单4-34

    // example01()

    ...

    // 查找&删除

    for (iteVec=vecId.begin(); iteVec != vecId.end(); ) {                               

        if ((*iteVec) == 2033) {

            cout << "find 2033 in vector." << endl;

            // erase()接口会返回删除后的下一个迭代位置

            iteVec = vecId.erase(iteVec);                                               ②

        } else {

            iteVec++;

        }

    }

    代码清单4-34中,当找到2033这个数字时,调用erase()接口将找到的迭代器从数组中删除,然后把返回值重新赋给迭代器iteVec,见标号②处。这时iteVec就指向删除2033后的下一个位置了,因此无须再执行迭代器自加操作,如果没找到2033,才对迭代器执行自加操作,在for循环设置步长时应采取空操作,见标号①处。

    2.向QVector中添加自定义类的对象

    向QVector中添加自定义类的对象作为成员,见代码清单4-35。

    代码清单4-35

    void example02(){

        // 添加成员

        QVector<CMyClass> vecObj;                                                     

        CMyClass myclass1(2011, "lisa");

        CMyClass myclass2(2012, "mike");

        CMyClass myclass3(2012, "mike");

        CMyClass myclass4(2013, "john");

        CMyClass myclass5(2013, "ping");

        CMyClass myclass6(2025, "ping");

        // 如果想让下面的语句编译通过并且按照预期执行,需要为CMyClass类提供拷贝构造函数

        vecObj.push_back(myclass1);

        vecObj.push_back(myclass2);

        vecObj.push_back(myclass3);

        vecObj.push_back(myclass4);

        vecObj.push_back(myclass5);

        vecObj.push_back(myclass6);          

        ...

    }

    在代码清单4-35中,首先定义了几个CMyClass对象并将它们初始化,然后调用vecObj.push_back()将它们添加到数组中。因为vecObj的类型是QVector<CMyClass>,所以push_back()接口需要传入对象的备份而非引用或指针,也就意味着编译器会调用对象的拷贝构造函数。因此,需要为类CMyClass编写拷贝构造函数(见代码清单4-36),以免编译器默认生成的拷贝构造函数无法满足要求,拷贝构造函数的实现请见本节的源代码。

    代码清单4-36

    // 拷贝构造函数

    CMyClass(const CMyClass& right);

    然后使用下标遍历数组,见代码清单4-37。

    代码清单4-37

    // example02()

    // 遍历成员,使用下标

    cout << endl << "-------------- QVector ---------------" << endl;

    cout << "print members using idx......" << endl;

    int idxVec = 0;

    for (idxVec = 0; idxVec < vecObj.size(); idxVec++) {

        cout << "    vecObj[" << idxVec << "] : id = " << vecObj[idxVec].getId() << ", name = " << vecObj[idxVec].getName().toLocal8Bit().data() << endl;

    }

    然后使用迭代器遍历数组,见代码清单4-38。

    代码清单4-38

    // 遍历成员,使用迭代器

    QVector<CMyClass>::iterator iteVec = vecObj.begin();

    for (iteVec = vecObj.begin(); iteVec != vecObj.end(); iteVec++) {

        cout << "    vecObj[" << idxVec << "] : id = " << (*iteVec).getId() << ", name = " << (*iteVec).getName().toLocal8Bit().data() << endl;

    }

    在使用迭代器时,也是用(*iteVec)的方法来访问数组成员。因为数组里存放的是对象,所以可以使用“.”操作符来调用对象的接口。如果数组里存放的是指针,就要用(*iteVec)->的语法调用对象的接口。 下面来查找某个对象,见代码清单4-39。

    代码清单4-39

    // example02()

    // 查找

    cout << endl << "-------------- QVector ---------------" << endl;

    cout << "begin find member in QVector......" << endl;

    CMyClass myclassx(2013, "john");                                                     

    QVector<CMyClass>::iterator iteVec = std::find(vecObj.begin(), vecObj.end(), myclassx);

    if (iteVec != vecObj.end()) {

        cout << "find myclassx in vector." << endl;

    }

    else {

        cout << "cannot find myclassx in vector" << endl;

    }

    在代码清单4-39中,在标号①处定义一个被查找对象myclassx,在标号②处同样也是使用std::find()来查找该对象。如代码清单4-40所示,这需要为自定义类CMyClass重载operator==操作符,否则编译器会报错。CMyClass::operator==()的实现见本节配套的源代码。

    代码清单4-40

    class CMyClass {

        ...

        // 重载操作符operator==

        bool operator==(const CMyClass& right);

        ...

    }

    3.向QVector中添加自定义类的对象的指针

    使用类对象的指针来演示QVector用法的代码见代码清单4-41。

    代码清单4-41

    void example03() {

        // 添加成员

        QVector<CMyClass*> vecObj;

        CMyClass* pMyclass1 = new CMyClass(2011, "lisa");

        CMyClass* pMyclass2 = new CMyClass(2012, "mike");

        CMyClass* pMyclass3 = new CMyClass(2012, "mike");

        CMyClass* pMyclass4 = new CMyClass(2013, "john");

        CMyClass* pMyclass5 = new CMyClass(2013, "ping");

        CMyClass* pMyclass6 = new CMyClass(2025, "ping");

        // 无须为CMyClass类提供拷贝构造函数

        vecObj.push_back(pMyclass1);

        vecObj.push_back(pMyclass2);

        vecObj.push_back(pMyclass3);

        vecObj.push_back(pMyclass4);

        vecObj.push_back(pMyclass5);

        vecObj.push_back(pMyclass6);

        ...

    }

    代码清单4-41中,先new出一些对象,然后将这些对象指针添加到数组。接着遍历数组的成员,如代码清单4-42所示。

    代码清单4-42

    // example03()

    // 遍历成员

    cout << endl << "-------------- QVector ---------------" << endl;

    cout << "print members in custom defined class using index......" << endl;

    int idxVec = 0;

    for (idxVec = 0; idxVec < vecObj.size(); idxVec++) {

        cout << "    vecObj[" << idxVec << "] : id = "

             << vecObj[idxVec]->getId() << ", name = "

             << vecObj[idxVec]->getName().toLocal8Bit().data() << endl;

    }

    与将对象添加到数组有所不同,将指针添加到数组时,退出程序前需要将这些指针指向的内存进行释放,否则将导致内存泄漏,如代码清单4-43所示。代码清单4-43给出了两种方法来遍历数组成员并释放数组成员所指向的内存。因为不能重复释放同一块内存,所以把用迭代器遍历的代码封掉。可以尝试一下把用下标遍历数组的代码封掉,把用迭代器遍历数组的代码解封。

    代码清单4-43

    // example03()

    // 退出前要释放内存

    // 方法1,使用下标遍历

    cout << endl << "-------------- QVector ---------------" << endl;

    cout << "desctruct members before exit......" << endl;

    idxVec = 0;

    for (idxVec = 0; idxVec < vecObj.size(); idxVec++) {

        cout << "    deleting " << idxVec << ", id = "

             << vecObj[idxVec]->getId() << ", name = "

             << vecObj[idxVec]->getName().toLocal8Bit().data() << endl;

              delete vecObj[idxVec];

    }

    // 方法2,使用迭代器遍历

    //QVector<CMyClass*>::iterator iteVec = vecObj.begin();

    //for (iteVec = vecObj.begin(); iteVec != vecObj.end(); iteVec++, idxVec++) {

    //    if (NULL != *iteVec) {

    //        delete *iteVec;

    //    }

    //}

    vecObj.clear();

    在使用QVector进行编程时,很多情况下都是将自定义的类放进QVector中,所以需要掌握两个知识点:

    (1)为自定义类编写拷贝构造函数。

    (2)为自定义类重载operator=操作符,以便能够使用std::find()接口在数组中查找成员。

    ----------------------------------------------------------------------------------------------------------------------------------------------

    《Qt 5/PyQt 5实战指南》目录

     

    展开全文
  • QVector基本用法

    万次阅读 多人点赞 2019-05-19 08:27:33
    QVector基本用法 QVector是Qt对所有数组的封装,比如我们想要一个int类型数组,我们原先会写int array[10],我们在Qt里可以写QVector <int> array(10),赋值的时候,我们依然可以照旧array[5]=4;想获取某一项...

    QVector基本用法

    QVectorQt对所有数组的封装,比如我们想要一个int类型数组,我们原先会写int array[10],我们在Qt里可以写QVector <int>  array(10),赋值的时候,我们依然可以照旧array[5]=4;想获取某一项的值也还可以array[9],也就是说,原来的特性我们还可以用。

    那么QVector有什么好处呢?

    我们可以用count函数获知数组中有多少个元素,方便遍历,原先我们必须预定义好大小,而用QVector虽然最好也先定义好大小,但是预先不定义也可以。

    我们可以使用append函数或者<<操作符来在数组最后端添加元素而不用担心溢出问题。

    需要包含头文件:

        #include<QVector> 

    添加元素:

        QVector<QString> strArray;         

        strArray.append("Hello"); //可以这样       

        strArray<<"World!"; //也可以这样        

        strArray<<"MyName"<<"is"<<"LEO";//也可以这样加上个元素        

        //现在strArray总共有5个字符串元素,strArray.count()==5     

    遍历:

        QVector<QString>::iterator iter;  

        for (iter=strArray.begin();iter!=strArray.end();iter++)  

        {  

            qDebug() <<  *iter << "\0"

        }  

    插入:

        strArray.insert(1,"这就是在helloworld之间添加");

    删除:

        strArray.remove(1); //删除第一个元素,从0开始

        strArray.remove(13); //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

    千次阅读 2020-01-14 11:43:09
    QVector是Qt的一个通用容器类。  它将其项存储在相邻的内存位置,并提供快速地、基于索引的访问(QVector可以看做是一个封装了一个数组的模板类[],它内部维护一个数组,并且提供给外部一些访问的方法)。 ...
  • QVector的内存释放

    2021-04-17 12:47:45
    QVector的内存释放 QVector的内存释放分两种情况: 如果T为非指针类型,那么直接使用QVector的clear方法就可以释放内存; 如果T为指针类型,直接使用clear方法将不能释放内存。这个时候可以使用void qDeleteAll ( ...
  • 使用Qt中的容器给C++开发带来很大的便利,而且QVector和QMap等容器扩展的一些成员函数也是很方便的。但是Qt的这些容器和STL库的容器比,效率到底怎么样?我就写了几个简单的遍历的例子,测试了QVector、vector等容器...
  • QT中QVector的基本用法

    万次阅读 2019-06-19 09:18:28
    一、利用data把QVector中的数据取出来 T *QVector::data() Returns a pointer to the data stored in the vector. The pointer can be used to access and modify the items in the vector. Example: ...
  • QVector较vector

    2021-09-01 11:37:12
    1.QVector可预先不定义大小,但越界情况下仍不能用[]操作符([]较at函数深复制,访问速度更慢)。 2.增加新元素可直接用append函数/<<运算符,在数组最后端添加元素而不用担心溢出问题。 二.参考链接 QVector...
  • 目录 一、前言: 二、QT 容器 2.1、简述 2.2、容器分类 1>、顺序容器:QList,QLinkedList,QVector,QStack 和 QQueue 2>、关联容器:QMap,QMultiMap,QHash,QMultiHash 和 QSet 2.3、QT 各容器简述 2.4、保存在 ...
  • //【2】第二种复制构造 与复制运算符 //方式1:qvector(&) t0.restart(); QVector<float> data3(data1); qDebug()的大小"()复制构造;时间为"(); data2.clear(); //方式2:=(&) t0.restart(); data2=data1; qDebug()的...
  •  定义了一个结构体数组,并将文本数据存储进去了,想用容器qvector存储起来使用,但是不知道具体该怎么操作。</p>
  • QVector用法详细介绍

    千次阅读 2020-03-08 22:53:52
    QVector类是动态数组的模板类,顺序容器,它将自己的每一个对象存储在连续的内存中,可以使用索引号来快速访问它们。使用前需要包含头文件 #include <QVector> 下面介绍QVector的基本用法,先看看它的一些...
  • 【Qt之QVectorQVector反转 prepend 逆转

    千次阅读 2019-12-05 09:36:04
    QVector与QList 数据量比较小时(小于1000项),没什么区别。 如果你需要开辟连续的内存空间存储,或者你的元素远比一个指针大,可以用QVector 按照索引获取元素时,QList比较快 追加插入元素时QVector大概快个百分之5...
  • STL vector 和 QT QVector的用法差别实例

    千次阅读 2020-01-13 17:58:57
     可见,如果访问的元素超过QVector的方位,QVector的断言会抛出一个错误。 4.样例  为比较两者的不同,可以实现一个样例:   #include #include<QVector> #include #include using std::vector;...
  • Qt之QVector基本用法

    2021-08-16 17:30:40
      QVector类是一个提供动态数组的模板类,是Qt对所有数组的封装。   之前我们定义一个int型的数组,我们会写int array[10],现在在Qt里我们可以定义成QVector< int > array(10)。   QVector< T >...
  • QList 和 QVector 来自Qt官方文档和Effective Qt QList<T>、QLinkedList<T>和QVector<T>提供了类似的API和功能。它们通常是可互换的,但会对性能产生影响。 QVector应该是默认的第一选择。 ...
  • QT的QVector类的使用

    2020-12-30 09:33:57
    QVector类是提供动态数组的模板类。 QVector 是Qt的通用容器类之一。它将项目存储在相邻的内存位置,并提供基于索引的快速访问。 QList ,QLinkedList ,QVector 和QVarLengthArray 提供类似的API和功能。它们通常是...
  • QVector容器类常见使用方法

    千次阅读 2019-05-15 08:59:04
    QVector类是一个提供动态数组的模板类。 QVector是Qt普通容器类的一种。它将自己的每一个对象存储在连续的内存中,可以使用索引号来快速访问它们。QList、QLinkedList和 QVarLengthArray也提供了相似的功能,它们...
  • Qt QVector对结构体排序

    2021-09-13 10:05:35
    #include <QTime> #include<QDebug> typedef struct _tempstruct { QTime tim; int index; }Tempstruct;...//传入QVector的地方 ...void sortVectbyTime(QVector<Tempstr...
  • QVector常见使用方法

    千次阅读 2020-04-28 15:45:28
    仅在此简单介绍QVector的一些常见函数,有兴趣的可以查下QT,在QT中介绍的很详细 构造函数,QVector的构造函数很多样化,常见的有 参考 QVector() 无参的构造函数 QVector(int size) 构造一个大小为size个 值为...
  • 我将每个操作步骤用一个类实现,将各类继承于一个基类,再将指向各子类的基类指针放在QVector/Vector,即可通过C++的多态实现调用各子类。 为此,我写了俩个范例测试代码. 一,各子类只单一继承同一基类 #...
  • QVector<QString> MyIOFile::readFile(){ QFile file("文件地址"); if(file.open(QIODevice::ReadOnly|QIODevice::Text)){ QTextStream stream(&file); qDebug()<<array; QString str; while ...
  • STL风格迭代器(只读、读写) Java风格迭代器(只读、读 写) QVector类 添加元素 修改元素 遍历容器 循环遍历 迭代器遍历 访问、查找元素 删除元素 QMap类[映射表] 定义 添加元素 遍历映射表 访问、查找元素 删除...
  • typedef struct _Customer // 结构体类型 { int age; QString name; int id; QString Keyword; QString Fromdata;...//Customer是一个结构体类型,使用时必须先Customer* p = new ...QVector容器的调用 在.h头
  • QVector使用示例

    千次阅读 2019-05-18 16:38:12
    本文以实例形式介绍QVector::insert() QVector::remove() 函数的使用方法。 源代码: #include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> MainWindow::MainWindow(QWidget *parent) :...
  • [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++)...
  • 需求:从海康工业相机硬触发5次,获取5张QImage类型图像数据存储到QVector中,然后再分别显示到界面上,当保存5张QImage类型图像数据到QVector后,遍历QVector中数据时,图像在界面上一直不显示,或只显示最后一张...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,471
精华内容 2,588
关键字:

qvector