-1
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 小时前才了解地图的,所以我仍然很困惑。
我不断收到错误消息:“调试断言失败!” .....“表达式:映射/设置迭代器不可递增”

在我的脑海中,如果我找到最高值,将其存储在数组中,然后将其从地图中删除,我将能够重复此操作并生成前 5 名列表!??但我无法删除最高值,我不知道为什么。

4

1 回答 1

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;
于 2013-03-15T21:23:44.193 回答