最简单的方法是放弃你的概念,直接使用它;
QList<int> intList;
foreach (const QString &myString, list)
intList.append(myString.toInt());
qSort(intList.begin(), intList.end(), qGreater<int>());
qDebug() << "MAX:" << intList.first();
qDebug() << "SECOND MAX:" << intList.at(1);
它比你原来的概念慢一点,平均 O(n*log(n)) 和 O(n^2) 最坏情况复杂度,比如快速排序。合并排序等其他排序可能会更慢。
但是,大多数时候使用 Qt 并不重要,因为 Qt 容器本质上比它们的标准库对应物慢,所以我认为这不是主要问题。如果是,您可以考虑切换到标准库并使用我将在下面修复的概念。
基本上,您将使用qSort 对您的内容进行升序排序。请注意,我应该使用first() convenience method 来获取第一项,而不是您最初尝试的 at(0)。基本相同,但更不言自明。
如果您需要保留原始容器,您可以复制它。
如果你真的想坚持你原来的概念,我会这样写:
main.cpp
#include <QDebug>
#include <QStringList>
int main()
{
QStringList List{"10", "7", "2"};
int max, secondMax;
secondMax = max = INT_MIN;
foreach (const QString &string, List) {
int i = string.toInt();
if (i > max) {
secondMax = max;
max = i;
} else if (i > secondMax) {
secondMax = i;
}
}
if (secondMax == INT_MIN)
secondMax = max;
qDebug() << "max val:" << max;
qDebug() << "second max val:" << secondMax;
return 0;
}
main.pro
TEMPLATE = app
TARGET = main
QT = core
SOURCES += main.cpp
CONFIG += c++11
构建并运行
qmake && make && ./main
输出
max val: 10
second max val: 7
请注意,最好使用 Qt 的 foreach 而不是 C 样式的迭代,因为您根本不需要索引。话虽这么说,它是未经测试的代码,但这个概念是有效的,所以把它当作你可能需要根据需要调整的伪代码。
这也不完全是你最初的概念,但我想我会这样做。