我需要使用Qt为C ++中的字符串创建等效的switch / case语句。我相信最简单的方法是这样的(伪代码)
enum colours { red, green, blue };
QString array[] colour_names = { "red", "green", "blue" };
switch (color_names[user_string]) {
case red: answer="Chose red";
case green: answer="Chose green";
case blue: answer="Chose blue";
other: answer="Invalid choice";
}
但这并没有利用Qt的一些功能。我已经阅读了QStringList(用于在字符串列表中查找字符串的位置)和std:map(请参阅How to easily map c++ enums to strings,我不完全理解)。
有没有更好的方法来切换字符串?
答案 0 :(得分:3)
将switch()
与字符串一起使用的唯一方法是使用字符串的整数值散列。您需要预先计算要比较的字符串的哈希值。例如,这是在qmake中用于读取可视工作室项目文件的方法。
重要提示:
如果您关心与其他字符串的哈希冲突,那么您需要比较案例中的字符串。不过,这仍然比做(N / 2)字符串比较便宜。
qHash
在QT 5中被重新设计,哈希与Qt 4不同。
不要忘记交换机中的break
语句。您的示例代码错过了,并且还具有无意义的切换值!
您的代码如下所示:
#include <cstdio>
#include <QTextStream>
int main(int, char **)
{
#if QT_VERSION < QT_VERSION_CHECK(5,0,0)
static const uint red_hash = 30900;
static const uint green_hash = 7244734;
static const uint blue_hash = 431029;
#else
static const uint red_hash = 112785;
static const uint green_hash = 98619139;
static const uint blue_hash = 3027034;
#endif
QTextStream in(stdin), out(stdout);
out << "Enter color: " << flush;
const QString color = in.readLine();
out << "Hash=" << qHash(color) << endl;
QString answer;
switch (qHash(color)) {
case red_hash:
answer="Chose red";
break;
case green_hash:
answer="Chose green";
break;
case blue_hash:
answer="Chose blue";
break;
default:
answer="Chose something else";
break;
}
out << answer << endl;
}
答案 1 :(得分:1)
QStringList menuitems;
menuitems << "about" << "history";
switch(menuitems.indexOf(QString menuId)){
case 0:
MBAbout();
break;
case 1:
MBHistory();
break;
}
答案 2 :(得分:0)
我在另一个网站上发现了一个使用QStringList颜色的建议,在交换机中使用IndexOf(),然后在case语句中使用枚举值