刚好今天在使用QFile的时候,需要做一个获取本地的文件夹名称,在这里我使用的代码如下所示:
QDir folder(ui->lineEdit_7->text()); // 当前文件夹
QStringList filters;
filters << "*.*/"; // 文件夹过滤器,包括子文件夹
QList<QFileInfo> directories = folder.entryInfoList();
for (const QFileInfo& dir : directories) {
qDebug() <<"文件夹名称" <<dir.fileName(); // 输出每个文件夹的路径
}
于是我就思考想弄一哈QList和QStringList它们两个之间的对比。
QList和QStringList都是Qt库中的类,它们的主要区别在于用途和功能。
QList是一个通用、高效的列表类,它提供了对列表的基本操作,如添加、删除、查找等。它是一个模板类,可以存储任意类型的对象,如整数、浮点数、字符串等。QList的主要优点是它的通用性和高效性,它适用于各种不同的数据类型和需求。
- 存储和操作列表数据:QList可以用于存储任意类型的对象,并且提供了方便的函数和操作符来对列表进行插入、删除、查找等操作。
- 事件处理:QList可以用于存储事件处理函数的参数,并且可以在事件触发时调用这些函数。
- 缓存数据:QList可以用于缓存数据,特别是在需要频繁访问的情况下。
- 存储和排序数据:QList可以用于存储和排序一组数据,并且可以使用QList::sort()函数来对列表进行排序。
- 存储和操作多维数组:QList可以用于存储和操作多维数组,并且可以使用QList::append()函数来添加元素。
另外C++里面也有类似的通用容器,叫vector,这个两者之间的区别是:
QList和C++中的vector在功能上有些相似,它们都是动态数组,可以动态地添加和删除元素。但是,它们之间也存在一些区别:
- 内存管理方式不同:QList是Qt库中的容器类,它自动管理内存,不需要手动释放内存;而vector是C++标准库中的容器类,需要手动管理内存,需要在不再使用元素后释放内存。
- 函数接口不同:QList和vector的函数接口不同,它们使用不同的函数来访问和操作元素。例如,QList使用at()函数来访问元素,而vector使用[]操作符。
- 性能不同:由于QList自动管理内存,因此它在某些情况下可能比vector更高效。例如,当删除元素时,QList只需要重新分配内存,而vector需要手动移动元素并释放内存。
总的来说,QList和vector都是动态数组,但它们在内存管理、函数接口和性能方面存在一些区别。选择使用QList还是vector取决于具体的需求和情况。
其中,QList的自动内存管理机制是通过Qt的内存管理机制来实现的。Qt使用一种称为"对象树"的内存管理策略,其中每个对象都有一个父对象,当一个对象不再需要时,它的父对象会负责释放它的内存。
对于QList来说,它的每个元素都是一个动态分配的对象,当QList被销毁时,它会自动释放所有元素的内存。这是通过在QList的析构函数中调用元素对象的delete操作符来实现的。
另外,QList还使用了一个内存池机制来优化内存分配。每次调用QList的append()函数时,它都会将新元素存储在一个内存池中,而不是直接分配新的内存。当内存池达到一定大小后,QList会一次性释放整个内存池的内存,这样可以减少内存分配和释放的开销,提高性能。
QStringList是一个专门用于处理字符串的列表类,它是QString的子类。它继承了QString的所有功能,并提供了额外的操作,如合并字符串、拆分字符串、根据索引查找字符串等。QStringList的主要优点是它的字符串处理功能,它使得处理字符串变得更加方便和高效。