2012-03-25 6 views
7

宿題の一部として、C++で配列の特定の値を連結する必要があります。だから、例えば私が持っている場合: - 私は私が得た値1234配列内のintを連結しますか?

でint型を得るように、[4]> V

int v[] = {0,1,2,3,4} 

私はV [1]を連結するためにいくつかの点で必要があるかもしれませんそれはstringstreamを使って作業し、値をstringstreamに追加してから整数に変換し直します。しかし、プログラム全体を通して、最終的には、v []がmyInt()関数に渡された約300万の異なる置換があり、stringstreamは(少なくともその値を扱う場合は)かなり高価に見えます。それは動作していますが、非常に遅く、私はそれを最適化するために何でもできるようにしようとしています。

C++の配列でintを連結する最適な方法はありますか?私はいくつかの検索を行っており、ほとんどどこでもstringstreamを使用するように示唆されているようです(これは動作しますが、私のプログラムを遅くするようです)。

編集:ちょっと明確にすると、結果はintである必要があります。

+2

何がint型の1が9以上である場合に発生することになっていますか?または負の? – Mat

+1

「連結する」とはどういう意味ですか?文字列や数字が必要ですか? 10倍に何が起こったのですか? –

+0

@Mat - 配列の値は常に0と9の間です。 – Nate

答えて

5

シンプルなソリューションのための擬似コード:

int result = 0; 
for (int i=0; i < len(v); i++) 
{ 
    result = result*10 + v[i]; 
} 

大きな配列が原因int型のサイズのオーバーフローに出て爆撃します。あなたが行うことができます

+0

おそらく浮動小数点型または倍精度型が公平に良いでしょうか? –

+0

私の値はこのプログラムで5桁を超えることはないので、intは正常に動作します。そして、これは私が実装を終えたところです。素晴らしいことです!実行時間を半分にする。 – Nate

3

方法について:

int result = (((v[1])*10+v[2])*10+v[3])*10+v[4]; 

要素の数ではなく、一定数以上の変数であれば、私はあなたがループに適用することができ、ここでパターンを見つけることができる確信しています。

+0

ありがとう、それは私が必要なものです。私はそれを試してみましょう! – Nate

1

すべてが整数です。あなたは次のことをしてはいけません。

//if you want to concatenate v[1] and v[4] 
int concatenated; 
concatenated = v[1]*10+v[4]; 
//If you want to concatenate all 
concatenated = 0; 
for(int i=1;i<=4;i++) 
    concatenated = concatenated*10+v[i]; 

出力は整数(文字列ではありません)になり

+0

ええ、出力をintにする必要があります。ありがとう! – Nate

1

は、ASCIIコードを覚えていますか?

char concat[vSize+1]; 
concat[vSize] = 0; 
for(int i = 0; i < vSize; i++) { 
    concat[i] = (v[i] % 10) & 0x30; 
} 
+0

ああ、ありがとう、ありがとう。 – Nate

+0

実際、あなたの投稿をもっと慎重に読んだので間違っています。私はあなたが文字列がほしいと思った。正しい答えは他の人に参照してください。 –

+1

私はあなたが '| 0x30'であるが、依然として '+ '0' 'がより明確になる。 – hvd

0

もの:

  1. あなたは-O3(または同等のコンパイラの最適化)でコンパイルしていることを確認してください。
  2. ベクトルで値を自分で生成していますか?その場合は、toInt()関数を単純なポインタ型を受け入れるように変更してみてください。
  3. 変換を自分で書く(ブラウザコード:コンパイルさえないかもしれない - uがしかしアイデアを得る):

    char* toInt(int* values, size_t length) 
    { 
        int *end = values + sizeof(int)*length; 
        int *cur = values; 
    
        char* buf = new char[length + 1] 
    
        for(char* out = buf;cur < end;++cur, ++buf) 
        { 
         *out = (char)*cur + '0'; 
        } 
        *buf = '\0'; 
        return buf; 
    } 
    
+0

-1これは非常にC-ishです。 C++で 'new'で割り当てられたCスタイルの文字列を返すことは危険です。なぜなら、呼び出し元が文字列を削除することを忘れて、何百万回も呼び出されたときに問題のあるメモリリークが発生する可能性があるからです。 – leftaroundabout

+0

@leftaroundabout:なぜコードがC-ishなので、なぜそれをdownvoteするのか分かりません。質問者は、非常に単純な関数のパフォーマンスを改善する方法を尋ねています。私はこのようにアプリケーションを書くつもりはありませんが、宿題の場合は必ずこれを使用します。 – nakiya

+0

シンプルでシンプルで効果的なパフォーマンスの向上なら、私はそれを落としていないでしょう。しかし、あなたのコードは、まともなコンパイラが 'std :: vector' /' std :: string'sを使ってより安全な、より簡単なvariantを作るほど速くコンパイルできます。それらを使用するように変更し、私はupvoteします。 – leftaroundabout

関連する問題