• ベストアンサー

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

  • const参照メンバを含む要素のvector

    久しぶりに趣味でプログラミングしてます。 const参照のメンバを含むオブジェクトを要素に持つvector って使えます? 下記はbcc32でコンパイルするとエラーが出ます。 _algobase.h 145:コンパイラは 'operator=' クラスの hoge を作成できない(関数 _STL::hoge * __copy<hoge *,hoge *,int>(hoge *,hoge *,hoge *,const random_access_iterator_tag &,int *) ) ちなみにv.clear();をコメントアウトするとコンパイルは通り実行も問題なくできます。 clear()の替わりにpop_back()としてもコンパイルは通り実行も問題なくできます。 コンパイラーのバグ?そもそもこんなことをしてはダメ? よろしくお願いします。 class hoge { public:  hoge(const int &i):_i(i){};  virtual ~hoge(){};  operator int () const {return _i;}  const int &_i; }; int main() {  int i1=1;  int i2=2;  hoge h1(i1);  hoge h2(i2);  std::vector<hoge > v;  v.push_back(h1);  v.push_back(h2);  v.clear();  std::vector<hoge >::iterator iter = v.begin();  while( iter != v.end() ){   std::cout << *iter << "\n";   ++iter;  }  return 0; }

  • C++ 構造体型のvector配列でエラーがでます

    構造体のvector配列を関数に渡しています。 以下のソースコードで、3点エラーがでます どのように変更すればよいですか? #include<stdio.h> #include<stdlib.h> #include<iostream> #include <vector> using namespace std; std::vector<int> v; typedef struct fukusosu{ int a; int b; }FUKUSOSU; int sort(vector<FUKUSOSU> v[], int N){ FUKUSOSU tmp; int j; for(int i = 0 ; i < N - 1 ; i++){ j = i ; for(int k = i + 1 ; k < N ; k++){ if(v[j].a > v[k].a){j = k;}//ここのaに対して、エラーがでます } tmp = v[j];//ここのイコールに対して、エラーがでます v[j] = v[i]; v[i] = tmp;//ここのイコールに対してエラーがでます } } int main(void){ int N; // 要素数 cin >> N; vector<FUKUSOSU> v(N); for(int i = 0; i < N; ++i){ cin >> v[i].a; cin >> v[i].b; } }

  • C++のvectorについて教えてください。

    C++のvectorについて教えてください。 現在悩んでいる問題について簡単に説明するために、テストコードを書きました。 #include <vector> class IntType { private: int num; public: IntType( int n ):num( n ){}; }; std::vector< IntType > IntVector; void main() { } このコードをDebug版でコンパイルすると 1>c:\program files (x86)\microsoft visual studio 9.0\vc\include\xutility(285) : error C2784: 'bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : テンプレート 引数を 'const std::reverse_iterator<_RanIt> &' に対して 'const size_t' から減少できませんでした 1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\xutility(2236) : 'std::operator <' の宣言を確認してください。 のようなエラーが出ます。 しかし、Release版でコンパイルするとコンパイルは通ります。 Debug版でコンパイルを通すにはどのようなコードを追加すればよいでしょうか? 知恵を貸してください。 よろしくおねがいします。 /** VisualStudio2008 AcademiEdition */

  • C++ vectorのbeginについて

    VC++2010にて下記コードのビルドは通るのですが、 vVecotrInt, vVectorIntPtrの要素数0のとき、iptr代入時に Debug assertaion Failed! vector iterator not dereferencableとなります。 そもそもbegin()はイテレータなので、ポインタに代入しようとしていることが間違いかと思うのですが。 質問1.int* iptr = ~ ではなく、std:vector<int>::iteratorとすれば、     要素数が0でもエラーがおきません。この違いは何でしょうか? 質問2.そもそもイテレータをポインタに代入して何か得することがあるんでしょうか?     ただイテレータとポインタは同じようなものだと思って、コーディングしてるだけなんでしょうか・・・ コード: // vVectorIntの要素を間接参照して(参照先はint)、そのアドレスをポインタに格納 std::vector<int> vVectorInt; int* iptr = &*vVectorInt.begin(); // ここでvector iterator not dereferencable // vVectorIntPtrの要素を間接参照して(参照先はint*)、ポインタに格納 std::vector<int*> vVectorIntPtr; int* iptr = *vVectorIntPtr.begin(); // ここでvector iterator not dereferencable // vVecotrIntPtr2の要素数0のときでも、イテレータを使えば問題ない std::vector<int*> vVectorIntPtr2; std::vector<int*>::iterator itr = vVectorIntPtr2.begin();

  • C++のreduce

    C++のreduceを使おうとすると error: 'reduce' was not declared in this scope となってしまいます reduceを使うにはどうしたらよいでしょうか? OSはMac GCCのバージョンは9.2.0_3となってます よろしくおねがいします コード #include <iostream> #include <vector> #include <numeric> using namespace std; int main() { const vector<int> v = {1, 2, 3}; int sum = reduce(v.begin(), v.end()); cout << sum << endl; }

  • STLのvectorの削除

    STLのvectorの削除を行う場合に vector<myclass> v; ・・・ v.erase(it); ・・・ というように削除するiteratorを渡しますが、 任意のインデックスのvectorを削除した場合は、 どのようにそのiteratorを取得するのでしょうか。 例えばv[5]を削除したのですが、 vector<myclass>::iterator it=v.begin(); for(int i=0;i<5;i++) it++; v.erase(it); というbegin()やend()からのインクリメント・デクリメントで取得するしかないのでしょうか? ご教示願います。

  • C++ の質問です

    vector a の中に 1 4 9 16 vector b の中に 4 7 9 9 11 が入っていて 新しい vector c の中に 1 4 4 7 9 9 9 11 16 のように小さい順に並べたいのですが、 どのようなforloop をかいたら良いのでしょうか?? アドバイスください。。 つなげることしか出来ないです。。。 vector<int> mergeSorted(const vector<int>& a, const vector<int>& b) { int n = a.size(); int m = b.size(); vector<int> c(n + m); int i; for (i = 0; i < n; i++) c[i] = a[i]; for (i = 0; i < m; i++) c[n + i] = b[i]; return c; } sort() を使ってはいけないという条件です。 なにか、アイディアありましたら、お願いいたします、、

  • C++ vectorに配列をプッシュしたい

    C++のstd::vectorが格納する要素として配列を指定することはできますか vectorを使って2次元配列を表現したいときは,たとえば std::vecor<std::vector<int>> v; とすれば2次元配列が表現できますよね. 2次元配列の列方向の要素数が2で固定されていて,行方向の要素数が不確定のデータを扱いたいので,2次元配列を格納するvectorで扱えればなと思いました. (2個で1組のデータがたくさんあるということなので,vectorの2次元配列ではありません) std::vector<int[2]> v; int a[2]; a[1] = 1; a[0] = 2; v.push_back(a); という書き方ではコンパイルできなかったのですが,vectorに配列要素を格納させることはできないのでしょうか. あるいは,もし可能ならどのように書けばよいのでしょうか. 結局は1組のデータセットを構造体化してそれをvectorにプッシュするやり方に落ち着いたのですが,疑問に思ったままモヤモヤしているので質問させて頂きます. 「vector 配列」などのキーワードで検索してみましたが,vectorの動的配列としての紹介記事が多くヒットしてしまい,自分ではうまく情報を発見することはできませんでした. よろしくお願いします.

  • C++ vector beginについて

    VC++2010にて 1.下記コードにおいて、変数iPと変数aの値(アドレス)が同じになると思ったのですが、異なる値になります。なぜでしょうか。 2.「&iPVector.begin()」はiPVectorの先頭の実体を返すので、int*型が返却されると思うのですが、「int* iP = (int*)&iPVector.begin();」というように、(int*)をつけて明示的にキャストしなければビルドが通りません。なぜでしょうか。 よろしくお願いします。 ----------------- std::vector<int*> iPVector; int* a; a = new int(2); iPVector.push_back(a); int* iP = (int*)&iPVector.begin();

  • C++言語のプログラムをfortranに変換

    const int N = 100; const double q = 10.0, dt = 0.00001, Dm = 30.0, t0 = 2.0, K = 1.0, pi = 3.141592, f = 3.0; double C[N], dC[N]; double dx = q/N; for (int i = 0; i < N; ++i) C[i] = 0; // 初期条件 for (double t = 0; t < t0; t += dt) {  C[0] = 0; // 境界条件1  C[N - 1] = K*sin(2*pi*f*t); // 境界条件2  for (int i = 1; i < N - 1; ++i) dC[i] = (Dm*(C[i + 1] - 2*C[i] + C[i - 1])/(dx*dx))*dt;  for (int i = 1; i < N - 1; ++i) C[i] += dC[i]; } for (int i = 0; i < N; ++i) cout << C[i] << endl; // t = t0 このプログラムをfortranに変換できる方いますか?

専門家に質問してみよう