您的位置:

Qt QVector详解

一、QVector简介

Qt QVector是一个动态数组模板类。它类似于C++ STL vector,但是具有更高的效率和更低的空间占用率。QVector在内部使用一个指向数组以及数组容量和大小的指针来表示动态数组。当数组存储容量不足时,QVector会自动扩展容量以便更多的数据。

二、QVector的基本操作

1. QVector的创建

创建QVector的最简单的方法是使用默认构造函数:

QVector<int> vector1; //创建一个空的整数数组

也可以使用列表初始化:

QVector<QString> vector2 {"Apple", "Banana", "Cherry"};

2. QVector的插入与删除

可以使用append()和prepend()在数组开头或结尾插入元素。还有insert()可以在数组中插入元素:

QVector<int> vector {1, 2, 3};
vector.append(4); //在末尾插入4
vector.prepend(0); //在头部插入0
vector.insert(2, 10); //在第3个位置插入值为10的元素

通过remove()可以删除数组中的元素:

vector.remove(1); //删除第2个元素
vector.removeFirst(); //删除第1个元素
vector.removeLast(); //删除最后一个元素

3. QVector的访问

QVector支持通过下标访问元素,也可以使用at()方法以及迭代器iterator来访问元素。vector.first()和vector.last()可以分别返回数组的第一个和最后一个元素。

QVector<QString> vector {"Apple", "Banana", "Cherry"};
QString item1 = vector[0]; //访问第一个元素
QString item2 = vector.at(1); //访问第二个元素
for (auto i = vector.constBegin(); i != vector.constEnd(); ++i) {
    //使用const迭代器访问整数数组
    cout << *i << endl;
}

4. QVector的遍历

QVector可以使用迭代器iterator进行遍历。您还可以使用foreach循环来遍历数组:

QVector<int> vector {1, 2, 3, 4, 5};
foreach(int item, vector) { //使用foreach遍历数组
    cout << item << endl;
}

三、QVector高级操作

1. QVector的排序

QVector支持使用qSort()方法进行排序,也可以使用STL的std::sort()来进行排序:

QVector<int> vector {3, 1, 4, 2, 5};
qSort(vector); //排序vector
for (int i = 0; i < vector.size(); ++i) {
    cout << vector[i] << endl;
}

2. QVector的拷贝

QVector支持使用copy()或operator=()方法创建数组的浅拷贝和深拷贝:

QVector<int> vector {1, 2, 3};
QVector<int> vector2 = vector; //使用operator=()方法进行深拷贝
QVector<int> vector3 = vector2.copy(); //使用copy()方法进行浅拷贝

3. QVector的容量调整

QVector会自动调整容量以便更多的数据,但是在某些情况下可能需要手动调整容量。可以使用reserve()方法来分配数组的存储空间:

QVector<int> vector;
vector.reserve(1000); //分配存储空间以容纳至少1000个元素

4. QVector的异常处理

QVector检查越界错误,并在发生错误时调用qFatal()方法结束程序。您可以通过设置全局QT_NO_EXCEPTIONS宏来禁用异常处理机制。同时还可以使用at()方法而不是使用下标来访问元素,以避免越界。此外,还可以使用value()方法来访问特定位置的元素,如果索引越界,则返回默认值:

QVector<int> vector {1, 2, 3};
try {
    int item = vector.at(4); //访问越界元素时抛出一个异常
} catch (const std::out_of_range& e) {
    //越界异常
    cout << e.what() << endl;
}
int defaultValue = -1;
int item2 = vector.value(4, defaultValue); //使用默认值来访问第5个元素

四、QVector实例代码

#include <QCoreApplication>
#include <QDebug>
#include <QVector>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    //创建一个空的字符串数组
    QVector<QString> vector1;

    //将字符串插入到数组中
    vector1.append("Apple");
    vector1.append("Banana");
    vector1.append("Cherry");

    //遍历数组
    foreach(QString fruit, vector1) {
        qDebug() << fruit;
    }

    //在数组中查找酸奶的索引
    if (vector1.contains("Yogurt")) {
        qDebug() << "Found Yogurt!";
    } else {
        qDebug() << "Did not find Yogurt!";
    }

    //创建一个整型数组
    QVector<int> vector2;

    //将整数插入到数组中
    vector2.append(1);
    vector2.append(2);
    vector2.append(3);
    vector2.append(4);
    vector2.append(5);

    //获取数组的第二个元素(下标为1)
    int secondItem = vector2.at(1);

    //遍历数组并求和
    int sum = 0;
    foreach(int number, vector2) {
        sum += number;
    }

    //排序数组
    qSort(vector2);

    //输出数组的所有元素
    for (int i = 0; i < vector2.size(); ++i) {
        qDebug() << vector2[i];
    }

    return a.exec();
}