2011-11-07 9 views
0

これはC++プログラムのコードスニペットです。C++で 'ostringstream'オブジェクトを管理するには?

string TwoSeries::getArrays() 
{ 
    ostringstream outIndex; 
    ostringstream outValueA; 
    ostringstream outValueB; 
    string stA; 
    string stB; 
    string valueA; 
    string index; 
    int *arA; 
    int * arB; 
    string valueB; 
    for(int x = 0; x < 200; x++) 
    {   

     outIndex << x; 
     index = outIndex.str(); 



     arA = getArrayA(); 
     outValueA << *(arA + x); 
     valueA = outValueA.str(); 


      arB = getArrayB(); 
     outValueB << *(arB + x); 
     valueB = outValueB.str(); 


     stA += index + ":" + valueA + " "; 
     stB += index + ":" + valueB + " "; 

    } 

    // return "Series A: \n"+stA+ "\n"+"Series B: \n"+ stB; 
    return index; 
} 

この関数は、最後のインデックスは、文字列にint型から変換され、それは199でなければなりませんしかし、その代わりに、このオブジェクトのoutIndex "を連結にすべての数字(文字列)を1つの文字列に、結果としてのようなものを与えて返す必要がありますこれは1234567891011121314151617 ... 198199です。最後の数字は199です。最後の数字だけを出力する完全なループの後に関数を強制するには、代わりにすべての数字が必要です。これを行う方法?

+4

「ostringstream」とは何と思いますか?なぜあなたが望まない値を挿入するのですか? –

答えて

2

あなたは、文字列ストリームをクリアしたい:

for(int x = 0; x < 200; x++) 
{   
    outIndex.str(""); 
    outValueA.str(""); 
    outValueB.str(""); 

代わりに、あなたは良いC++スタイルを採用することができますし、ループ内でローカルに宣言します。

for(int x = 0; x < 200; x++) 
{   
    ostringstream outIndex; 
    ostringstream outValueA; 
    ostringstream outValueB; 

あなたはそれでいる間のことができます。残りの部分も同様に動かしてください。それとも...次のように書き換える:あなたは冗長な多くの作業をやっているし、今はすべてのそれらの値が使用されていない

string TwoSeries::getArrays() 
{ 
    string index; 

    int x; 
    for(x = 0; x < 200; x++) 
    {   
     ostringstream osA, osB; 

     osA << x << ":" << *(getArrayA() + x) + " "; 
     osB << x << ":" << *(getArrayB() + x) + " "; 

     string stA = osA.str(); // warning: value isn't used 
     string stB = osB.str(); // warning: value isn't used 
    } 

    ostringstream osA, osB; 
    outIndex << (x-1); // previous index 
    return outIndex.str(); 
} 

注意を。おそらく、表示されていないコードが多いかもしれません:)

+1

ループを「良いC++スタイル」で宣言するのはなぜですか?それをクリアする方が効率的ですね。 – rubenvb

+0

すべての変数を一番上に定義するのは古いCスタイル(C99より前)です。 C++のイディオムは、RAII(決定論的破壊)、可変スコープ、例外処理の観点からオブジェクトのライフタイムを管理することに大きく依存しています。私の答えを更新しました – sehe

+0

sehe:すばらしい早すぎる最適化かもしれませんが、必要なときに毎回ストリームを再構築することに関連して、ここで多くのパフォーマンス関連の質問を覚えているようです。オブジェクト。無関係ですが、それでもなお留意することが重要です。 C++はパターンプログラミングではありません。 – rubenvb

1

ループ内でループ内でのみ必要なオブジェクトを移動します。これは、各反復をリセットするためにそれらの原因:

string TwoSeries::getArrays() 
{ 
    string stA; 
    string stB; 
    for(int x = 0; x < 200; x++) 
    { 
     ostringstream outIndex; //this stream used all three times. 
     outIndex << x; 
     string index = outIndex.str(); 

     int *arA; 
     arA = getArrayA(); 
     outIndex << *(arA + x); 
     string valueA = outIndex.str(); 

     int * arB; 
     arB = getArrayB(); 
     outIndex << *(arB + x); 
     string valueB = outIndex.str(); 

     stA += index + ":" + valueA + " "; 
     stB += index + ":" + valueB + " "; 
    } 

    return "Series A: \n"+stA+ "\n"+"Series B: \n"+ stB; 
} 

あなたの問題は、各反復が、あなたはそれがゆっくりと、これまで使用されているすべてのインデックスのリストを構築させ、outIndexにインデックスを追加しましたが、それをリセットすることはありませんということでした。これは他の2つのストリングストリームでも発生します。 .str()ではなく、ストリームをクリアします。

+0

ありがとうございました。迅速な回答と簡単な解決策でした。 – ucas

1
for(int x = 0; x < 200; x++) 
{   
    outIndex << x; 
} 

xをoutIndexに連続して連結します。

for(int x = 0; x < 200; x++) 
{   
    outIndex << x; 

    .... 

    outIndex.str(""); 
} 

これは、ループのたびにoutIndexをクリアします。

関連する問題