-5

今日、整数をローマ数字に変換する興味深いコードを書きました。実行中のコード全体は次のとおりです。

#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;
}

このコードは、現在私の Xcode 4.6.2 で正常に動作します。しかし、Xcode 4.6.2 で if(i==0) return "ZERO" の直前の 8 行目の "//" を削除すると、プログラムがエンドレスに実行されます。誰でもこれを説明できますか?ありがとう!

4

2 に答える 2

8

逆の順序で反復するには、rbegin と rend を使用します。

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

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

于 2013-06-07T22:14:50.390 に答える
7
for(iter=m.end();iter !=m.begin();iter--){
    while(i >=iter->first){
        roman+=iter->second;
        i-=iter->first;
    }
}

最初の反復では、m.end()どちらが不正であるかを逆参照します。あなたは不運でした(いいえ、幸運ではありません)、この大きなバグを隠していたため、コメントアウトされた行で動作するように見えました。

他のみんなと同じように、 から始めてbegin()、 を使用しiter++ます。

于 2013-06-07T22:08:49.157 に答える