无法从地图中删除记录

时间:2013-03-15 21:07:42

标签: c++

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个列表!但我无法删除最高值,我无法弄清楚原因。

1 个答案:

答案 0 :(得分:1)

来自std::map::erase

  

迭代器有效性
  引用该函数删除的元素的迭代器,指针和引用无效。   所有其他迭代器,指针和引用都保持其有效性。

因此,如果您的迭代器指向已删除的元素,则它在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;