大家好,欢迎来到IT知识分享网。
QVector 是 Qt 框架中提供的一个模板类,用于动态数组的操作。它与标准库中的 std::vector 类似,但更适合在 Qt 应用中使用。 QVector 提供了多种功能,便于管理和操作动态数组。下面将详细介绍 QVector 的各项功能,并给出示例代码。
一、 创建和初始化
可以通过不同的方式创建和初始化 QVector。
QVector 是 Qt 框架中提供的一个模板类,用于存储和操作动态数组。下面将详细介绍 QVector 的各种创建和初始化方法,并给出相关的知识点。
1. 默认构造函数
创建一个空的 QVector。
QVector<int> vec1;
2. 指定大小的构造函数
创建一个指定大小的 QVector,所有元素都初始化为默认值。
QVector<int> vec2(10); // 创建一个大小为10的QVector,所有元素初始化为0
3. 指定大小和初始值的构造函数
创建一个指定大小并指定初始值的 QVector。
QVector<int> vec3(10, 5); // 创建一个大小为10的QVector,所有元素初始化为5
4. 使用 std::initializer_list 初始化
使用初始化列表来创建并初始化 QVector。
QVector<int> vec4 = {
1, 2, 3, 4, 5};
5. 拷贝构造函数
使用另一个 QVector 初始化。
QVector<int> vec5(vec4); // 使用 vec4 初始化 vec5
6. 从指针和大小初始化
使用指针和大小初始化 QVector。
int array[] = {
1, 2, 3, 4, 5}; QVector<int> vec6(array, array + 5); // 使用 C++ 数组初始化 QVector
7. 使用 std::vector 初始化
将 std::vector 转换为 QVector。
std::vector<int> stdVec = {
1, 2, 3, 4, 5}; QVector<int> vec7 = QVector<int>::fromStdVector(stdVec);
8. 使用 QList 初始化
将 QList 转换为 QVector。
QList<int> list = {
1, 2, 3, 4, 5}; QVector<int> vec8 = QVector<int>::fromList(list);
9. 使用 QVector 初始化 QList
将 QVector 转换为 QList。
QVector<int> vec9 = {
1, 2, 3, 4, 5}; QList<int> list2 = vec9.toList();
10. 使用 fill 方法初始化
使用 fill 方法将 QVector 中的所有元素设置为指定值。
QVector<int> vec10(10); vec10.fill(7); // 将所有元素设置为7
11. 通过 resize 方法调整大小并初始化
使用 resize 方法调整 QVector 的大小,新的元素会被默认值初始化。
QVector<int> vec11; vec11.resize(10); // 调整大小为10,所有新元素初始化为0
12. 通过 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(); // 输出vec内容 for (int value : 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; }
五、查找和排序
5.1 常规排序
可以查找元素和对 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; }
5.2 QVector自定义结构排序
在 QVector 中存储自定义结构并对其进行排序,可以利用 qSort 或者 std::sort,需要为自定义结构定义合适的比较函数。下面是一个详细的示例,包括自定义结构的定义、初始化和排序。
- 步骤:
- 定义自定义结构:
创建一个包含两个成员变量的自定义结构。 - 实现比较函数:
定义一个比较函数,用于排序。 - 创建并初始化 QVector:
创建一个QVector对象,并插入一些自定义结构的实例。 - 排序 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(); }
- 解释:
- 定义自定义结构:
struct Person { QString name; int age; Person(const QString &n, int a) : name(n), age(a) { } };Person结构体有两个成员变量name和age,并通过构造函数进行初始化。 - 实现比较函数:
bool compareByAge(const Person &p1, const Person &p2) { return p1.age < p2.age; }比较函数
compareByAge按照age进行比较,用于排序。 - 创建并初始化 QVector:
QVector<Person> people; people.append(Person("Alice", 30)); people.append(Person("Bob", 25)); people.append(Person("Charlie", 35)); people.append(Person("David", 20));创建一个
QVector<Person>,并添加一些Person对象。 - 排序 QVector:
std::sort(people.begin(), people.end(), compareByAge);使用
std::sort函数对QVector进行排序,传入比较函数compareByAge。
- 输出结果:
Before sorting: "Alice" 30 "Bob" 25 "Charlie" 35 "David" 20 After sorting by age: "David" 20 "Bob" 25 "Alice" 30 "Charlie" 35
通过上述步骤,你可以在 QVector 中存储自定义结构并对其进行排序。根据需要修改比较函数,可以实现基于不同条件的排序。
六、其他常用功能
还有一些其他常用功能,比如 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 是 Qt 提供的一个功能强大的动态数组类,具备了动态数组所需的各种基本操作,包括添加、删除、访问和遍历元素,同时还提供了大小管理、排序和查找等高级功能。熟练掌握 QVector 可以极大地提高 Qt 开发的效率和代码质量。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/110640.html