我正在尝试使用每个索引的映射向量创建一个跟踪最近使用的地址的函数。每次找到地址(用作映射键)时,它都会更新关键成员变量值。如果它不是表中的映射值,则会添加它。这样我就可以跟踪旧地址和新地址。最初我尝试按以下方式编写代码:
int key = 0;
void update(uint32_t address, int index, vector<map<uint32_t, int> >& table)
{
auto search = table.at(index).find(address);
if(it != table.at(index).end())
{
table[index][address] = ++key;
}
else
{
table.at(index).insert(make_pair(address, ++key));
}
}
但是,每次我去测试我的功能时,VS2013总会抛出一个未处理的异常错误,通知我Unhandled exception
因std::out_of_range
到达auto search
行而被抛出。我认为错误被抛出,因为地图最初是空的,并且没有地图可供它搜索任何地址。所以我修改它以确定表是否为空,如果是,则插入第一对,否则如果不是,则在表中搜索地址值,并更新密钥:
int key = 0;
void update(uint32_t address, int index, vector<map<uint32_t, int> >& table)
{
if(table.at(index).empty())
{
table.at(index).insert(make_pair(address, key));
}
else
{
auto search = table.at(index).find(address);
if(it != table.at(index).end())
{
table[index][address] = ++key;
}
else
{
table.at(index).insert(make_pair(address, ++key));
}
}
}
但是if(table.at(index).empty())
行发生同样的异常。然后我把它缩小,只是为了看看我是否可以简单地捕获和存储任何地图:
int key = 0;
void update(uint32_t address, int index, vector<map<uint32_t, int> >& table)
{
table.at(index).insert(make_pair(address, ++key));
}
这也会在table.at(index).insert(make_pair(address, ++key))
生成相同的未处理异常。
不仅如此,我还尝试确定table.at(index) == NULL
或nullptr
或0
。寻找将地图对添加到矢量的替代方法,而不是使用insert
。不幸的是,map
(assign
或push_back
)不存在我所看到的选项。我还研究了实现try-catch语句,但不确定如何编写它,特别是使用“throw”关键字。
我不知道是什么导致了这个问题。有没有人对可能出现的问题有任何建议?或者我做错了什么?也许我的程序可能不喜欢我的地图矢量?
谢谢!