我试图利用operator[]in std::map来使用键读取元素.但是当我试图访问一个无效的密钥时,它会抛出一个我无法使用的异常try- catch阻塞.这是我正在使用的代码:
class MapElement
{
public:
int a;
char c;
};
int main()
{
MapElement m1,m2,m3;
m1.a =10;m1.c = 'a';
m2.a =20;m2.c ='b';
m3.a =30;m3.c ='c';
map <char ,MapElement*> Mymap;
map<char,MapElement*>::iterator iter = Mymap.begin();
Mymap.insert(iter , std::pair<int, MapElement*>('1',&m1));
Mymap.insert(iter , std::pair<int, MapElement*>('1',&m2));
cout<<Mymap['1']->a;
try
{
cout<<Mymap['2']->a;
}
catch(exception e)
{
cout<<e.what();
}
catch(...)
{
cout<< "unknown error";
}
}
Run Code Online (Sandbox Code Playgroud)
我该如何处理这个例外?
我正在 QT 版本 4.8 以及 5.12.9 中编译以下代码。
QHash<QString, int> m_userDataHash;
m_userDataHash.insert("white", 1);
m_userDataHash.insert("yellow", 3);
m_userDataHash.insert("lightblue", 5);
m_userDataHash.insert("darkblue", 7);
m_userDataHash.insert("pink", 9);
m_userDataHash.insert("red", 11);
m_userDataHash.insert("green", 13);
m_userDataHash.insert("black", 15);
m_userDataHash.insert("grey", 17);
QHashIterator<QString, int> i(m_userDataHash);
while (i.hasNext())
{
i.next();
ui->ColorCombo->addItem(i.key());
}
Run Code Online (Sandbox Code Playgroud)
由于不同 qt 版本中的插入顺序不同,此代码的行为有所不同。
在 Qt 5.12.9 中
在 Qt 4.8 中
我怎么解决这个问题?为什么会发生这种情况?
我检查了 QHash 文档但无法弄清楚任何内容。 https://doc.qt.io/qt-5/qhash.html#insert
我碰巧遇到了一个宏定义,如下面的c ++代码所示(https://github.com/LairdCP/UwTerminalX).
#define SpeedModeInactive 0b00
#define SpeedModeRecv 0b01
#define SpeedModeSend 0b10
#define SpeedModeSendRecv 0b11
Run Code Online (Sandbox Code Playgroud)
当我尝试使用visual studio 2010编译它时,它给我以下错误.
Error 14 error C2059: syntax error : ')'
Run Code Online (Sandbox Code Playgroud)
这个宏是什么意思?宏的用法如下所示.
if ((gchSpeedTestMode == SpeedModeSendRecv || gchSpeedTestMode == SpeedModeRecv) && (gintSpeedBytesReceived10s > 0 || ui->edit_SpeedBytesRec10s->text().toInt() > 0))
{
//Data has been received in the past 10 seconds: start a timer before stopping to catch the extra data packets
gchSpeedTestMode = SpeedModeRecv;
gtmrSpeedTestDelayTimer = new QTimer();
gtmrSpeedTestDelayTimer->setSingleShot(true);
connect(gtmrSpeedTestDelayTimer, SIGNAL(timeout()), this, SLOT(SpeedTestStopTimer()));
gtmrSpeedTestDelayTimer->start(5000);
//Show message …Run Code Online (Sandbox Code Playgroud)