1. QList与QStringList容器概述
在Qt框架中,QList和QStringList是最常用的两种顺序容器。QList是一个通用的模板类容器,可以存储任意类型的元素;而QStringList是QList
QList的内部实现采用数组列表结构,元素在内存中连续存储(指针类型除外)。这种设计使得QList在随机访问和尾部追加操作上都有很好的性能表现。QStringList继承了QList的所有特性,并添加了一些专门针对字符串操作的便捷方法。
提示:从Qt 6开始,QVector和QList已经统一为同一个实现,QVector现在只是QList的别名。这意味着在Qt 6中,QList实际上使用的是QVector的内存模型。
2. 遍历QList容器的多种方法
2.1 基于范围的for循环(C++11风格)
这是最简洁的遍历方式,适用于Qt 5.7及以上版本:
cpp复制QList<int> numbers = {1, 2, 3, 4, 5};
for (const auto &num : numbers) {
qDebug() << num;
}
这种方式的优点是:
- 代码简洁易读
- 自动类型推导
- 支持const引用避免拷贝
2.2 使用STL风格迭代器
Qt提供了完整的STL兼容迭代器支持:
cpp复制QList<QString> names = {"Alice", "Bob", "Charlie"};
for (auto it = names.begin(); it != names.end(); ++it) {
*it = it->toLower(); // 可以修改元素
qDebug() << *it;
}
STL风格迭代器分为两种:
begin()/end():可读写迭代器cbegin()/cend():只读迭代器
2.3 使用Java风格迭代器
虽然不推荐在新代码中使用,但旧项目中可能会见到:
cpp复制QList<double> values = {1.1, 2.2, 3.3};
QListIterator<double> i(values);
while (i.hasNext()) {
qDebug() << i.next();
}
Java风格迭代器的主要缺点是性能稍差,且不如STL迭代器灵活。
2.4 使用索引遍历
对于需要索引的场景,可以使用传统for循环:
cpp复制QList<QColor> colors = {Qt::red, Qt::green, Qt::blue};
for (int i = 0; i < colors.size(); ++i) {
qDebug() << "Color" << i << ":" << colors[i].name();
}
注意:
- 使用
size()而不是count()获取元素数量(Qt 6推荐) - 对于非常大的QList,
at()比operator[]更安全,因为它会进行边界检查
3. 遍历QStringList的特殊方法
3.1 使用QStringList特有方法
QStringList提供了几个特有的遍历方法:
cpp复制QStringList languages = {"C++", "Python", "Java", "Go"};
// 使用join连接字符串
qDebug() << languages.join(", ");
// 使用filter过滤
QStringList filtered = languages.filter("a", Qt::CaseInsensitive);
// 使用replaceInStrings修改所有字符串
languages.repl
