本篇文章来讲述一下再qt开发中有哪些常用的C++语言类型
1.QVector类型
QVector类型是Qt容器类库中的一个重要部分,提供了类似于C++标准库中的std::vector的功能,但同时拥有Qt独特的优势。它是一个动态数组,可以容纳任意数量的元素,并且支持在末尾添加、插入和删除元素。
与其他容器相比,QVector在随机访问元素时具有出色的性能,同时在尾部添加和删除元素时也能保持较高的效率。QVector是Qt框架中一个用于存储数据的容器类,可以存储各种类型的数据,如整数、浮点数、自定义类等。
2.QVector和Vector(通常指的是C++标准库中的std::vector)在功能和使用上有很多相似之处,但也有一些关键的区别。以下是一些主要的差异点:
- 隐式共享:QVector具有隐式共享的特性,而std::vector则没有。当多个QVector对象共享相同的数据时,它们不会相互干扰,而且修改其中一个对象也不会影响其他对象。而std::vector则没有这种隐式共享的机制。
- 边界检查:在QVector中,无论使用
at()
函数还是operator[]
,都会进行边界检查,以确保访问的元素索引在有效范围内。而在std::vector中,operator[]
不会进行边界检查,只有在使用at()
函数时才会进行边界检查。因此,使用QVector相对来说更加安全。- 动态大小调整:QVector在创建时不需要预先定义大小,它可以动态地调整大小以适应新添加的元素。而std::vector也可以动态调整大小,但在某些情况下,可能需要手动调用
resize()
函数来调整大小。- 性能差异:通常情况下,std::vector的效率要高于QVector,因为std::vector是C++标准库中的容器,其实现相对简单且经过优化。而QVector则是Qt框架中的容器,其实现相对复杂,并且在某些情况下可能会比std::vector慢一些。然而,这也要根据具体的使用场景来决定,有些情况下QVector可能会更适合。
Qvector使用代码实例:
#include <QVector>
#include <QDebug>
int main() {
QVector<int> numbers;
// 添加元素
numbers.append(1);
numbers.append(2);
numbers.append(3);
numbers.append(4);
numbers.append(5);
// 使用迭代器遍历
for (QVector<int>::iterator it = numbers.begin(); it != numbers.end(); ++it) {
qDebug() << *it;
}
// 在第二个位置插入元素6
numbers.insert(1, 6);
// 删除第三个元素
numbers.remove(2);
// 使用下标遍历
for (int i = 0; i < numbers.size(); ++i) {
qDebug() << numbers[i];
}
// 打印修改后的QVector
qDebug() << "Modified vector:" << numbers;
return 0;
}
2.Qlist
QList和std::list都是C++中用于存储数据的容器类,但它们之间有一些关键的区别。
- 内部实现:QList是基于数组和链表的结合体,而std::list是一个双向链表。在QList中,每个节点的指针不是通过传统的“next”指针来指向下一个节点,而是将这些指针存储在一个数组中。这意味着QList在遍历元素时,实际上是通过找到数组中的指针来访问节点,而不是像std::list那样逐个节点地遍历。
- 性能:由于QList内部使用了数组和链表的结合,它在某些情况下可能比std::list具有更高的性能。特别是当需要频繁地访问元素时,QList的效率可能接近于QVector(一段连续的内存)。然而,需要注意的是,QList在插入和删除元素时可能需要进行更多的操作,因为它需要维护数组和链表的结构。
- 内存管理:QList和QVector一样,使用隐式共享来管理内存。这意味着当多个QList对象共享相同的数据时,它们实际上是共享同一块内存区域。这种机制有助于减少内存使用和提高性能。而std::list则没有这种隐式共享的特性。
- 边界检查:与QVector类似,QList在访问元素时也进行了边界检查。这有助于确保程序的安全性和稳定性。相比之下,std::list在访问元素时不会进行边界检查,因此需要程序员自行确保访问的有效性。
2.Qlist 代码实例:
#include <QList>
#include <QDebug>
int main() {
// 创建一个空的QList<QString>
QList<QString> stringList;
// 向QList中添加元素
stringList.append("Apple");
stringList.append("Banana");
stringList.append("Cherry");
// 使用迭代器遍历QList
for (QList<QString>::iterator it = stringList.begin(); it != stringList.end(); ++it) {
qDebug() << *it;
}
// 使用const迭代器遍历QList(不修改元素)
for (const QList<QString>::iterator it = stringList.constBegin(); it != stringList.constEnd(); ++it) {
qDebug() << *it;
}
// 使用范围和基于范围的for循环遍历QList(C++11及以后版本)
for (const QString &str : stringList) {
qDebug() << str;
}
// 检查QList的大小
qDebug() << "Size of the list:" << stringList.size();
// 访问第一个和最后一个元素
qDebug() << "First element:" << stringList.first();
qDebug() << "Last element:" << stringList.last();
// 在列表开头插入一个新元素
stringList.prepend("Orange");
// 在列表末尾插入一个新元素
stringList.append("Mango");
// 在指定位置插入一个新元素
stringList.insert(2, "Lemon");
// 删除指定位置的元素
stringList.removeAt(2);
// 删除所有元素
stringList.clear();
// 再次检查QList的大小
qDebug() << "Size of the list after clearing:" << stringList.size();
return 0;
}
好了 本篇文章就到这里结束了 在这里我要推荐一个课程 小编感觉这个课程挺好的: