• ベストアンサー

C言語の配列をC++のvectorに高速に変換したい

質問は表題のとおりです。 単純な方法では以下の通りになると思いますが、 (C言語文字列から string への変換のように) 一括変換の仕組みは vector にないのでしょうか? static const int n=5; int a[n]={0,1,2,3,4}; std::vector<int> v(n); std::vector<int>::iterator vit=v.begin(); for(int i=0; i<n; i++){ *vit++ = a[i]; } 上記の例では n=5 ですが、nがとても大きな場合に適用したいと考えています。 ちなみに、gcc 3.4.3 を使っています。

質問者が選んだベストアンサー

  • ベストアンサー
  • Werner
  • ベストアンサー率53% (395/735)
回答No.4

> C言語の配列に関して、STL のアルゴリズム(binary_searchなど)を > 使いたいと考えているのですが、 それなら素直にこうすればよいのではないの? -------------------- #include <algorithm> #include <iostream> int main(){   using namespace std;   static const int n=5;   int a[n]={0,1,2,3,4};   cout << binary_search(a, a+n, 3) << endl;   cout << binary_search(a, a+n, 6) << endl;   return 0; }

hazenoki
質問者

お礼

C言語の配列に関して、STL のアルゴリズムって 使えるんですね!! 目から鱗です。 ずーっと、使えないと思い込んでいて、 自分で実装しようかとか いろいろ考えていました。 ありがとうございました。

その他の回答 (3)

回答No.3

static const int n=5; int a[n]={0,1,2,3,4}; std::vector<int> v(n); v.assign(a,a+n);

hazenoki
質問者

お礼

ご回答、ありがとうございました。 実際に試してみたのですが、 元の私の例と速度的には 全く変わりませんでした。 でも、No.4 さんのご回答でそもそも変換しなくても 良いとわかったので、問題は解決しました。 ありがとうございました。

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.2

うーん。何とどう比べて早くしたいのでしょうか?

hazenoki
質問者

お礼

参考意見ありがとうございました。 おかげで、No.4 さんの回答が得られました。

hazenoki
質問者

補足

少し言葉足らずでした。すみません。 C言語の配列に関して、STL のアルゴリズム(binary_searchなど)を 使いたいと考えているのですが、 そのために、配列からベクトルにデータコピーする オーバーヘッドを気にしています。 もちろん、そのままでは使えないと思いますので vector に うまく変換できたらいいかな?と思いまして質問しました。 vector<int> のメモリアロケーションが、C言語の配列+アルファ だとしたら、コンストラクトする際に、うまくポインターを渡せば 最適化してくれないのかなと考えが及んでいます。 (もちろんコンパイラの実装によると思いますが) No.1 の方が書かれた方法が私のイメージに近いので、実際に 処理が早くなるか試してみようと考えています。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

実行が高速な訳ではありませんが... static const int n=5; int a[n]={0,1,2,3,4}; std::vector<int> v(&a[0], &a[n]); とすれば、少なくともコーディングは高速化できます。

hazenoki
質問者

お礼

ご回答、ありがとうございました。 実際に試したところ、コーディングだけでなく、 処理速度も30%ほど改善しました!! (-O3 オプションを付けています。) でも、No.4 さんの回答により、 そもそも変換の必要ないことがわかりました。 ありがとうございました。

関連するQ&A