C++ Can';不要从地图中删除记录 string*fooood::topfiefoo(){ 地图卷; typedef std::map::iterator it_type; 对于(i=0;i检查){ top=迭代器->第一个; 检查=迭代器->秒; } 结果[i]=顶部; 卷。擦除(顶部); } } 返回新字符串[5]; }

C++ Can';不要从地图中删除记录 string*fooood::topfiefoo(){ 地图卷; typedef std::map::iterator it_type; 对于(i=0;i检查){ top=迭代器->第一个; 检查=迭代器->秒; } 结果[i]=顶部; 卷。擦除(顶部); } } 返回新字符串[5]; },c++,C++,不到12小时前我才学会地图,所以我仍然很困惑。 我不断收到错误:“调试断言失败!”。。。。。“表达式:映射/集迭代器不可递增” 在我的头脑中,如果我找到了最大值,将其存储在数组中,然后将其从映射中删除,我将能够重复此操作并生成一个前5名列表!??但我无法删除最大值,也无法找出原因。来自 迭代器有效性 引用函数删除的元素的迭代器、指针和引用无效。 所有其他迭代器、指针和引用都保持其有效性 因此,如果迭代器指向已删除的元素,则在erase之后该元素无效,并且不允许对其进行递增 另一点是您的返回值。如

不到12小时前我才学会地图,所以我仍然很困惑。
我不断收到错误:“调试断言失败!”。。。。。“表达式:映射/集迭代器不可递增”

在我的头脑中,如果我找到了最大值,将其存储在数组中,然后将其从映射中删除,我将能够重复此操作并生成一个前5名列表!??但我无法删除最大值,也无法找出原因。

来自

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

因此,如果迭代器指向已删除的元素,则在
erase
之后该元素无效,并且不允许对其进行递增

另一点是您的返回值。如果要返回
结果
数组,必须首先复制它或立即在堆上分配它。现在,返回一个空的
std::string
数组

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];
}
std::string*result=newstd::string[5];
对于(i=0;等秒>检查){
top=迭代器->第一个;
检查=迭代器->秒;
}
}
结果[i]=顶部;
卷。擦除(顶部);
}
返回结果;

在哪里设置
nTransactions
?在第二个for循环之后的某个地方缺少一个紧括号。。。它应该放在哪里?
nTransactions
存储在类之外。@威尔:好的,这很清楚,但是设置它的语句是什么?您应该提供一些上下文。您可能正在访问queue@Xymostech:对不起,现在修好了。但这不是问题所在。我的思路是,如果我在迭代器循环之外删除它,它只会重新计算映射记录?@Will
volumes.erase(顶部)在你的循环迭代器中。我的代码乱七八糟,我刚刚意识到你是绝对正确的!问题是我的
卷。擦除(顶部)在我的for循环中!谢谢!:)@请查看有关返回值的答案。由于您无法更改返回类型,因此
string*result=newstring[5]
返回结果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;