-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 時間も経っていないので、まだ非常に混乱しています。
「Debug Assertion Failed!」というエラーが表示され続けます。..... "式: マップ/セット イテレータはインクリメントできません"

頭の中で上位の値を見つけて配列に格納し、それをマップから削除すると、これを繰り返して上位 5 つのリストを生成できます!?? しかし、トップ値を削除できず、その理由がわかりません。

4

1 に答える 1

1

からstd::map::erase

反復子の有効性
関数によって削除された要素を参照する反復子、ポインター、および参照は無効になります。他のすべての反復子、ポインター、および参照は、その有効性を維持します。

したがって、イテレータが削除された要素を指している場合、それは後で無効にeraseなり、インクリメントすることはできません。

もう 1 つのポイントは、戻り値です。配列を返したい場合は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 に答える