2016-09-25 2 views
0

sが文字列のコンストラクタ(#5 http://www.cplusplus.com/reference/string/string/string/を参照)によって作成されたときにを呼び出すと、範囲外の例外が発生します。メモリ文字列の表現map :: at()の差異スローエラー

文字列を宣言して初期化すると、期待値が返されます。 GDBを使用すると、2つの異なるメソッドの値が異なって実装されているように見えます。c = 'I'

これは文字列表現またはメソッドの問題ですか?これらの変数が両方とも文字列の場合、なぜその実装の詳細が重要なのでしょうか?

要約するので
// Roman_int.cpp 
// Roman Constants 
extern const int M = 1000; 
extern const int CM = 900; 
extern const int D = 500; 
extern const int CD = 400; 
extern const int C = 100; 
extern const int XC = 90; 
extern const int L = 50; 
extern const int XL = 40; 
extern const int X = 10; 
extern const int IX = 9; 
extern const int V = 5; 
extern const int IV = 4; 
extern const int I = 1; 

extern const unordered_map<string, int> strRom_map_intAra 
{ 
    {"M",M}, 
    {"CM",CM}, 
    {"D",D}, 
    {"CD",CD}, 
    {"C",C}, 
    {"XC",XC}, 
    {"L",L}, 
    {"XL",XL}, 
    {"X",X}, 
    {"IX",IX}, 
    {"V",V}, 
    {"IV",IV}, 
    {"I",I} 
}; 

istream& operator>>(istream& is, Roman_int& r) 
{ 
    // throw exception if stream bad() 
    is.exceptions(is.exceptions()|ios_base::badbit); 

    string romStr; 
    get_contig_str(is,romStr); 
    vector<int> intRoms; 
    for (char c : romStr) 
    { 
      string s{1,c}; 
      string test = "I"; 
      intRoms.push_back(strRom_map_intAra.at(s)); 
    } 
//... 

// GDB Snippit 
142    for (char c : romStr) 
(gdb) 
144      string s{1,c}; 
(gdb) print c 
$1 = 73 'I' 
(gdb) n 
145      string test = "I"; 
(gdb) print s 
$2 = "\001I" 
(gdb) n 
146      intRoms.push_back(strRom_map_intAra.at(s)); 
(gdb) print test 
$3 = "I" 

test

答えて

3

をしませんしながら、GDBがfを見

string s{1,c}; 
代わり

string s(1,c); 

を使用してみてくださいout-of-range例外でc = 'I' , s{1,c} = "\001I" , test = "I" strRom_map_intAra.at(s)結果を示していますプログラム

#include <iostream> 

int main() 
{ 
    std::string s1(1, 'I'); 
    std::string s2{1, 'I'}; 

    std::cout << "size s1: " << s1.size() << std::endl; 
    std::cout << "size s2: " << s2.size() << std::endl; 
} 

をollowingすると、その出力は

std::string s1(1, 'I'); 

であなたは(この場合には、1)指定されたサイズで文字列をinizializeたコンストラクタを呼び出しているため

size s1: 1 
size s2: 2 

で、すべての文字は指定されたchar(この場合はI)で初期化されます。

std::string s2{1, 'I'}; 

あなたは文字のリストを使用して文字列をinizialize:

  • 値1('\x01')の文字

  • とcharcter 'I'