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