string* Foooood::topFiveFoo(){
std::map<std::string, unsigned long> volumes;
typedef std::map<std::string, unsigned long>::iterator it_type;
for(i=0;i<nTransactions;i++){
volumes[tDeque.at(i).fooSymbol] += tDeque.at(i).fooShares;
}
string top;
string result[5];
int check = 0;
for(i=0;i<5;i++){
for(it_type iterator = volumes.begin(); iterator != volumes.end(); iterator++) {
if(iterator->second > check){
top = iterator->first;
check = iterator->second;
}
result[i] = top;
volumes.erase(top);
}
}
return new string[5];
}
我在不到12小时前才知道地图,所以我仍然很困惑 我一直收到错误:“Debug Assertion Failed!” .....“表达式:map / set iterator not incrementable”
在我的脑海中如果找到最高值,将其存储在数组中,然后将其从地图中删除,我将能够重复此操作并生成前5个列表!但我无法删除最高值,我无法弄清楚原因。
答案 0 :(得分:1)
迭代器有效性
引用该函数删除的元素的迭代器,指针和引用无效。 所有其他迭代器,指针和引用都保持其有效性。
因此,如果您的迭代器指向已删除的元素,则它在erase
之后无效,并且您不允许它递增。
另一点是你的回报价值。如果要返回result
数组,则必须先将其复制或立即在堆上分配。现在,您返回一个空的std::string
数组。
std::string *result = new std::string[5];
for(i=0;i<5;i++){
for(it_type iterator = volumes.begin(); iterator != volumes.end(); iterator++) {
if(iterator->second > check){
top = iterator->first;
check = iterator->second;
}
}
result[i] = top;
volumes.erase(top);
}
return result;