QT - Qvector用法
QVector 是 Qt 框架中提供的一个模板类,用于动态数组的操作。它与标准库中的 std::vector 类似,但更适合在 Qt 应用中使用。 QVector 提供了多种功能,便于管理和操作动态数组。下面将详细介绍 QVector 的各项功能,并给出示例代码。
创建和初始化
可以通过不同的方式创建和初始化 QVector。
QVector 是 Qt 框架中提供的一个模板类,用于存储和操作动态数组。下面将详细介绍 QVector 的各种创建和初始化方法,并给出相关的知识点。
默认构造函数
创建一个空的 QVector。
QVector<int> vec1; |
指定大小的构造函数
创建一个指定大小的QVector,所有元素都初始化为默认值。
QVector<int> vec2(10); // 创建一个大小为10的QVector,所有元素初始化为0 |
指定大小和初始值的构造函数
创建一个指定大小并指定初始值的 QVector。
QVector<int> vec3(10, 5); //创建一个大小为10的QVector,所有元素初始化为5 |
使用 std::initializer_list 初始化
使用初始化列表来创建并初始化 QVector。
QVector<int> vec4 = {1, 2, 3, 4, 5}; |
拷贝构造函数
使用另一个 QVector 初始化。
QVector<int> vec5(vec4); // 使用 vec4 初始化 vec5 |
从指针和大小初始化
使用指针和大小初始化 QVector。
int array[] = {1, 2, 3, 4, 5}; QVector<int> vec6(array, array + 5); // 使用 C++ 数组初始化 QVector |
使用 std::vector 初始化
将 std::vector 转换为 QVector。
std::vector<int> stdVec = {1, 2, 3, 4, 5}; QVector<int> vec7 = QVector<int>::fromStdVector(stdVec); |
使用 QList 初始化
将 QList 转换为 QVector。
QList<int> list = {1, 2, 3, 4, 5}; QVector<int> vec8 = QVector<int>::fromList(list); |
使用 QVector 初始化 QList
将 QVector 转换为 QList。
QVector<int> vec9 = {1, 2, 3, 4, 5}; QList<int> list2 = vec9.toList(); |
使用 fill 方法初始化
使用 fill 方法将 QVector 中的所有元素设置为指定值。
QVector<int> vec10(10); vec10.fill(7); // 将所有元素设置为7 |
通过 resize 方法调整大小并初始化
使用 resize 方法调整 QVector 的大小,新的元素会被默认值初始化。
QVector<int> vec11; vec11.resize(10); // 调整大小为10,所有新元素初始化为0 |
通过 reserve 预留空间
预留空间不会改变 QVector 的大小,但会改变它的容量。
QVector<int> vec12; vec12.reserve(20); // 预留20个元素的空间 |
元素访问
可以通过下标或迭代器访问 QVector 的元素。
#include <QVector> #include <QDebug> int main() { QVector<int> vec = {1, 2, 3, 4, 5}; // 下标访问 qDebug() << "First element:" << vec[0]; qDebug() << "Second element:" << vec.at(1); // 迭代器访问 for (QVector<int>::iterator it = vec.begin(); it != vec.end(); ++it) { qDebug() << *it; } // 常量迭代器访问 for (QVector<int>::const_iterator it = vec.cbegin(); it != vec.cend(); ++it) { qDebug() << *it; } return 0; } |
添加和移除元素
可以使用多种方法在 QVector 中添加和移除元素。
#include <QVector> #include <QDebug> int main() { QVector<int> vec; //添加元素 vec.append(1); vec.append(2); vec.append(3); //在指定位置插入元素 vec.insert(1, 10); //在索引1处插入10 //移除元素 vec.remove(2); //移除索引2处的元素 vec.removeLast(); //移除最后一个元素 for (int value : vec) { // 输出vec内容 qDebug() << value; } return 0; } |
大小和容量
可以检查和调整 QVector 的大小和容量。
#include <QVector> #include <QDebug> int main() { QVector<int> vec = {1, 2, 3, 4, 5}; qDebug() << "Size:" << vec.size(); //获取大小 qDebug() << "Capacity:" << vec.capacity(); //获取容量 vec.resize(10); //调整大小: 调整大小为10,新增元素初始化为0 vec.reserve(20); //预留容量: 预留容量为20 vec.squeeze(); //缩减容量: 将容量调整为当前大小 qDebug() << "New Size:" << vec.size(); qDebug() << "New Capacity:" << vec.capacity(); return 0; } |
查找和排序
常规排序
可以查找元素和对 QVector 进行排序。
#include <QVector> #include <QDebug> #include <algorithm> int main() { QVector<int> vec = {5, 3, 1, 4, 2}; // 查找元素 int index = vec.indexOf(3); // 查找值为3的元素的索引 qDebug() << "Index of 3:" << index; // 排序 std::sort(vec.begin(), vec.end()); // 输出排序后的vec内容 for (int value : vec) { qDebug() << value; } return 0; } |
QVector自定义结构排序
在 QVector 中存储自定义结构并对其进行排序,可以利用 qSort 或者 std::sort,需要为自定义结构定义合适的比较函数。下面是一个详细的示例,包括自定义结构的定义、初始化和排序。
- 步骤:
1.定义自定义结构: 创建一个包含两个成员变量的自定义结构。
2. 实现比较函数: 定义一个比较函数,用于排序。
3. 创建并初始化 QVector: 创建一个 QVector 对象,并插入一些自定义结构的实例。
4. 排序 QVector: 使用 std::sort 或 qSort 对 QVector 进行排序。
代码示例:
#include <QCoreApplication> #include <QVector> #include <QDebug> #include <algorithm> // 1. 定义自定义结构 struct Person { QString name; int age; Person(const QString &n, int a) : name(n), age(a) { } }; // 2. 实现比较函数 bool compareByAge(const Person &p1, const Person &p2) { return p1.age < p2.age; } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 3. 创建并初始化 QVector QVector<Person> people; people.append(Person("Alice", 30)); people.append(Person("Bob", 25)); people.append(Person("Charlie", 35)); people.append(Person("David", 20)); qDebug() << "Before sorting:"; for (const Person &p : people) { qDebug() << p.name << p.age; } // 4. 排序 QVector std::sort(people.begin(), people.end(), compareByAge); qDebug() << "After sorting by age:"; for (const Person &p : people) { qDebug() << p.name << p.age; } return a.exec(); } |
其他常用功能
还有一些其他常用功能,比如 clear、contains、count 等。
#include <QVector> #include <QDebug> int main() { QVector<int> vec = {1, 2, 3, 4, 5}; // 清空QVector vec.clear(); // 检查是否包含某个值 vec.append(1); vec.append(2); vec.append(3); bool contains = vec.contains(2); qDebug() << "Contains 2:" << contains; // 获取某个值的出现次数 int count = vec.count(2); qDebug() << "Count of 2:" << count; return 0; } |
QVector 和 std::vector 的互操作
QVector 和 std::vector 可以互相转换。
#include <QVector> #include <vector> #include <QDebug> int main() { QVector<int> vec = {1, 2, 3, 4, 5}; // QVector 转换为 std::vector std::vector<int> stdVec = vec.toStdVector(); // std::vector 转换为 QVector QVector<int> newVec = QVector<int>::fromStdVector(stdVec); // 输出 newVec 内容 for (int value : newVec) { qDebug() << value; } return 0; } |
QVector的常用接口
构造函数:
QVector():创建一个空的 QVector 容器。 QVector(int size):创建一个指定大小的 QVector 容器。 QVector(int size, const T &value):创建一个指定大小的 QVector 容器,并用给定值填充。 QVector(const QVector<T> &other):复制构造函数,用另一个 QVector 容器创建一个新的 QVector 容器。 |
元素访问:
T &operator[](int i):通过索引访问元素,返回指定索引处的元素的引用。 const T &operator[](int i) const:以只读方式通过索引访问元素。 T &at(int i):通过索引访问元素,会检查索引是否越界。 T &front():返回容器中的第一个元素的引用。 const T &front() const:以只读方式返回容器中的第一个元素。 T &back():返回容器中的最后一个元素的引用。 const T &back() const:以只读方式返回容器中的最后一个元素。 |
容量和大小:
bool isEmpty() const:判断容器是否为空。 int size() const:获取容器中元素的数量。 int capacity() const:获取容器的容量。 void reserve(int size):预分配指定数量的元素空间,提高性能。 void squeeze():释放未使用的容量,将容量调整为实际元素数量。 |
修改容器:
void clear():清空容器中的所有元素。 void resize(int size):调整容器的大小。 void fill(const T &value, int size = -1):用给定值填充容器,可以指定填充个数。 void append(const T &value):在容器末尾添加一个元素。 void prepend(const T &value):在容器开头添加一个元素。 void insert(int i, const T &value):在指定位置插入一个元素。 void replace(int i, const T &value):替换指定位置的元素。 void remove(int i):移除指定位置的元素。 void remove(int i, int count):从指定位置开始移除指定数量的元素。 void removeAll(const T &value):移除容器中所有等于给定值的元素。 bool removeOne(const T &value):移除容器中第一个等于给定值的元素。 |
查找:
int indexOf(const T &value, int from = 0) const:从指定位置开始查找给定值的元素,返回第一个找到的元素的索引。 int lastIndexOf(const T &value, int from = -1) const:从指定位置开始向前查找给定值的元素,返回第一个找到的元素的索引。 bool contains(const T &value) const:判断容器中是否包含给定值的元素。 int count(const T &value) const:计算容器中给定值的元素的个数。 |
排序:
void sort(Qt::SortOrder order = Qt::AscendingOrder):对容器中的元素进行排序,可以指定升序或降序。 void stableSort(Qt::SortOrder order = Qt::AscendingOrder):对容器中的元素进行稳定排序,可以指定升序或降序。 |
迭代器:
iterator begin():返回容器的起始迭代器。 const_iterator begin() const:返回容器的只读起始迭代器。 iterator end():返回容器的结束迭代器。 const_iterator end() const:返回容器的只读结束迭代器。 |
比较操作符:
bool operator==(const QVector<T> &other) const:判断两个 QVector 容器是否相等,元素数量和值都相等时为 true。 bool operator!=(const QVector<T> &other) const:判断两个 QVector 容器是否不相等。 |
其他功能:
QVector<T> &operator=(const QVector<T> &other):赋值操作符,将一个 QVector 容器赋值给另一个。 QVector<T> mid(int pos, int length = -1) const:获取容器中指定范围的元素,返回一个新的 QVector 容器。 void swap(QVector<T> &other):交换两个 QVector 容器的内容。 |
总结
QVector 是 Qt 提供的一个功能强大的动态数组类,具备了动态数组所需的各种基本操作,包括添加、删除、访问和遍历元素,同时还提供了大小管理、排序和查找等高级功能。熟练掌握 QVector 可以极大地提高 Qt 开发的效率和代码质量。