使用if(condition)返回时的C++内存错误:难以置信

Jun*_*Jun -4 c++ error-handling if-statement return

今天我写了一些有趣的代码,将整数转换为罗马数字.整个运行代码在这里:

#include <iostream>
#include <map>
#include <string>

using namespace std;

string arabic2roman(int i){
//if(i==0) return "ZERO";

map<int, string> m;
m.insert(pair<int,string>(0,"ZERO"));
m.insert(pair<int,string>(1,"I"));
m.insert(pair<int,string>(4,"IV"));
m.insert(pair<int,string>(5,"V"));
m.insert(pair<int,string>(9,"IX"));
m.insert(pair<int,string>(10,"X"));
m.insert(pair<int,string>(40,"XL"));
m.insert(pair<int,string>(50,"L"));
m.insert(pair<int,string>(90,"XC"));
m.insert(pair<int,string>(100,"C"));
m.insert(pair<int,string>(400,"CD"));
m.insert(pair<int,string>(500,"D"));
m.insert(pair<int,string>(900,"CM"));
m.insert(pair<int,string>(1000,"M"));

string roman;
map<int,string>::iterator iter;
for(iter=m.end();iter !=m.begin();iter--){
    while(i >=iter->first){
        roman+=iter->second;
        i-=iter->first;
    }
}
return roman;
}

int main(){
    int test=12345;
    cout << arabic2roman(test) << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这段代码现在在我的Xcode 4.6.2上工作正常.但是如果在if(i == 0)之前的第8行中删除"//",则返回"ZERO",在Xcode 4.6.2上,程序无休止地运行.任何人都能解释一下吗?谢谢!

Man*_*726 8

要以相反的顺序迭代,请使用rbegin和rend:

for(iter=m.rbegin();iter !=m.rend(); ++iter){
    while(i >=iter->first){
        roman+=iter->second;
        i-=iter->first;
    }
}
Run Code Online (Sandbox Code Playgroud)

http://en.cppreference.com/w/cpp/container/map/rbegin


Luc*_*ore 7

for(iter=m.end();iter !=m.begin();iter--){
    while(i >=iter->first){
        roman+=iter->second;
        i-=iter->first;
    }
}
Run Code Online (Sandbox Code Playgroud)

在第一次迭代中,您取消引用m.end()是非法的.你运气不好(不,不幸运)它似乎与这条线路一起工作,因为它隐藏了这个主要的错误.

像其他人一样,从begin()使用开始iter++.

  • 或``rbegin()`到`rend()`. (5认同)