• ベストアンサー

std::vectorのマージ

std::vectorで値が重複しないマージを行う一般的な方法はありますか? A = { 1, 2, 3, 4, 5 } B = { 4, 5, 6, 7, 8 } A + B = { 1, 2, 3, 4, 5, 6, 7, 8 } こういう感じにしたいのです。 今はforで回しているのですが、もっといい方法があるのではないかと思って。 よろしくお願いします。

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

  • ベストアンサー
  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.1

>A + B = { 1, 2, 3, 4, 5, 6, 7, 8 } >こういう感じにしたいのです。 std::set_union(A.begin(), A.end(), B.begin(), B.end(), back_inserter(C));

kouichi_jp
質問者

補足

#include <algorithm> #include <vector> int main() {   std::vector<int> A, B, C;   size_t nMax = 6;   for(size_t n = 1; n < nMax; n++)   {     A.push_back(n);     B.push_back(n + 3);   }   std::set_union(A.begin(), A.end(), B.begin(), B.end(), back_inserter(C));   return 0; } A [5](1,2,3,4,5) B [5](4,5,6,7,8) C [8](1,2,3,4,5,6,7,8) うまくいきました。ありがとうございます。 ところで、以下のような場合でもC [8](1,2,3,4,5,6,7,8)という結果を得る方法はありますか? #include <algorithm> #include <vector> int main() {   std::vector<int> A, B, C;      size_t nMax = 6;   for(size_t n = 1; n < nMax; n++)   {     A.push_back(n);     A.push_back(n);     B.push_back(n + 3);   }   std::set_union(A.begin(), A.end(), B.begin(), B.end(), back_inserter(C));   return 0; } A [10](1,1,2,2,3,3,4,4,5,5) B [5](4,5,6,7,8) C [13](1,1,2,2,3,3,4,4,5,5,6,7,8)

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.2

>以下のような場合でもC [8](1,2,3,4,5,6,7,8)という結果を得る方法はありますか? last = std::unique(A.begin(), A.end()); std::set_union(A.begin(), last, B.begin(), B.end(), back_inserter(C));

kouichi_jp
質問者

お礼

どうもありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • std::vector 2次元配列の列方向初期長

    std::vectorを使った2次元配列を std::vector< std::vector<int> > a; の様な方法で宣言できるところまでは分かったのですが、aの列の初期長を予め指定する方法はないでしょうか? 例えば、必要な列方向初期長が10であるとします。 行方向のデータ数Nが実行中に与えられる場合 a.resize(N); for (auto &n : a) n.reserve(10); で目的は達せられるのですが、Nが数千万のオーダーだど非常に時間がかかります。 仮にNが2000万個とすると、私のPCでa.resize(N)は約90ミリ秒で完了しますが、for (auto &n : a) n.reserve(10);には約10秒を必要とします。 そこで、aの列の初期長は10(reserve(10)の意味)であると言う何らかの指定を行って a.resize(N)を行った際に、自動的にfor (auto &n : a) n.reserve(10);を行ったのと同じ状態になっているという aの宣言方法があれば教えてください。 aの列方向の初期長(本例の場合は10)は与えますが、.push_back() により10個以上のデータを列方向に詰める場合も想定する為、完全固定長の std::array<> は使用できません。

  • Vectorのポインタが入ったvector

    windows Vista sp1, Visual C++ 2008でC++の勉強をしています。 Vectorへのポインタが入ったvectorを使うプログラムを書いているのですがうまくいかず、困っています。 どういうプログラムかというと、 入力ファイルの">"という記号を区切りとして、その間にある各行をひとまとめのグループとしてvectorにいれます。 さらに各vectorのポインタをべつのvectorに入れます。 最終的に区切りの数だけvectorができ、入力ファイルを読み終わった後に すべてのvectorを"各グループのポインタが入ったvector"からループ処理ですべて出力する、というものです。 /入力ファイル input.txt/ > human cat dog > beetle dragonfly spider > salmon saury catfish > vector1には human cat dog vector2にはbeetle dragonfly spider vector3にはsalmon saury catfish が入り、 別のvectorにそれぞれのvectorのポインタをいれ、 最後にこのvectorをつかって全ファイル内容を出力するというものです。 具体的に書くと、 ">"の区切りごとの各行のstringを入れるvectorとしてeach_vector。 each_vectorのポインタを入れるvectorをvector_of_ptr_each_vectorとします。 ">"を認識するごとに new で each_vectorの領域を確保し、そのポインタをvector_of_ptr_each_vectorに追加していき、">"のない行のstringを each_vectorに入れます。 ファイルの読み込みが終わった後でvector_of_ptr_each_vectorからイテレータを使って各vector(each_vector)の全要素をそれぞれ出力する、というものです。 以下のようにコードを書きました。 #include <fstream> #include <string> #include <vector> #include <iostream> using namespace std; int main( ) { ifstream ifs("input.txt"); string buf; std::vector<string> each_vector; std::vector<std::vector<string> *> vector_of_ptr_each_vector; while(ifs && getline(ifs, buf)) { if(buf[0] == '>'){ std::vector<string>* ptr_eachvector ; ptr_eachvector = new std::vector<string>; each_vector = *ptr_eachvector ; vector_of_ptr_each_vector.push_back(ptr_eachvector) ; } each_vector.push_back(buf) ; } printf("\n output from vector of ptr of vector\n"); std::vector<std::vector<string> *>::iterator it_b = vector_of_ptr_each_vector.begin(); while( it_b != vector_of_ptr_each_vector.end() ) { std::vector<string>::iterator it_c = it_b->begin();    //エラー1 while( it_c != it_b->end() ) //エラー2 { cout << *it_c << endl; ++it_c; } ++it_b; } return 0; } ですが、エラーでビルドされず、 std::vector<string>::iterator it_c = it_b->begin(); の行に関して error C2839: invalid return type 'std::vector<_Ty> **' for overloaded 'operator ->' error C2039: 'begin' : is not a member of 'std::_Vector_iterator<_Ty,_Alloc>' while( it_c != it_b->end() )   の行に関して error C2839: invalid return type 'std::vector<_Ty> **' for overloaded 'operator ->' 1> with 1> [ 1> _Ty=std::string 1> ] error C2039: 'end' : is not a member of 'std::_Vector_iterator<_Ty,_Alloc>' 1> with 1> [ 1> _Ty=std::vector<std::string> , 1> _Alloc=std::allocator<std::vector<std::string> > 1> ] fatal error C1903: unable to recover from previous error(s); stopping compilation というようなエラーが出ます。 vectorのポインタを入れたvectorの扱い、特にイテレータに関して問題があると思うのですが原因が分かりません。 また、new でのeach_vectorの領域確保の方法も怪しいという感じがします。 解決策、アドバイスありましたらよろしくお願いします。

  • std_logic_vector のピンアサイン

    cyclone ii ボード、Quartus ii 13.0sp1 です。 port ( a, b : in std_logic_vector (15 downto 0); としたとき (1)Pin Planner でピンアサインをしないで、コンパイルするとOKです。 (2)まずa[15]にFitter Location に表示されているピンを設定して、コンパイルするとOKです。    全てをFitter LocationのようにすればOKだと思うのですが、そうすると配線が整然としません。 そこで、自由に設定できるのかな(?)と思って どういうルールで設定するべきかもわからぬままに a[15]にいろいろなPIN_xを設定してみると (3)PIN_141ならばコンパイルはOKでした。 (4)PIN_1ならばコンパイルエラーでした。 std_logic_vector (15 downto 0) の場合どのようなルールでピンアサイン するのか教えてください。

  • マージソートについて

    マージソートの要素の比較と交換回数を計測するプログラムを作っているのですが、マージのどの段階が交換処理になるのかが分からず困っています。 マージ処理の実行回数をカウントする配列sを設けて処理をカウントする場合、以下のプログラムだとどのタイミングでカウントすればよいでしょうか? ちなみに配列aは初めに値を割り振った配列で、配列bは別途で用意した作業用配列です。 最後のfor文やif文付近で配列の値を変化させて計測してみたのですが、計算量に合った動きをしてくれませんorz void merge_sort(int a[], int low, int high){ int mid, i, j, k; if(low >= high) return; mid = (low + high)/2; merge_sort(a, low, mid); merge_sort(a, mid+1, high); for(i = low; i <= mid; i++) b[i] = a[i]; for(i = mid+1, j=high; i <= high; i++, j--) b[i] = a[j]; i = low; j = high; for(k = low; k <= high; k++){ if(b[i] <= b[j]){ a[k] = b [i++]; } else{ a[k] = b[j--]; } } }

  • vectorのresizeについて

    class A{ vector<double> data; public: A(int a){ this->data.resize(a); } }; template<class T> class B { std::vector<T> vec; public: B(int a){ this->vec.resize(a); } }; int main() { B<A> c(10); } としたとき class A のコンストラクタの値を指定することができません. vectorのresizeにコンストラクタの値を指定することができるのでしょうか. また,resize以外にこのようなことをすることができるのでしょうか. 回答よろしくお願いします.

  • vectorを使っていたいのですが上手くいきません

    文字列(A)から特定の文字列(B)を抽出しながらvectorにどんどん入れていくプログラムを作成しています。(文字列(B)の位置や長さはわかっているとします。) そこで、文字列(A)から、文字列(B)に相当するアドレスをvectorにどんどん入れているのですが、先pushした値が後からpushした値と全て同じ値になってしまいます。 これは、アドレス渡しが原因と分かってはいるのですが、どう書けば上手くいくかわかりません。 そこでご教授頂きたいと思っています。 自分が書いたプログラムは以下になります。 #include <string.h> #include <stdio.h> #include <stdlib.h> #include <vector> using namespace std; void main(){ char* stringA; vector<char*> result; char temp[16];//文字列Bの大きさ for(int i=0;i<file.size();i++){ strncpy(temp,&buffer[i],16); result.push_back(*temp); //次の文字列Bの位置までインデックスを移動//// while(buffer[i]!=0x0A){ i++; } i++; } }

  • C++でSTLのVectorを使った構造体について

    Vectorで作った構造体配列a内でさらにVectorで宣言された配列bを作った場合、bに数値を代入するにはどうすれば良いのでしょうか? struct A {  std::vector<int> b; }; std::vector<A> a;

  • ベクトル

    ベクトルa=(1,2)、ベクトルb=(3,1)についてです。このとき、|ベクトルa-ベクトルb|の値はどうなるのでしょうか? 単純に成分同士で引き算し、(-4,3)ということでしょうか? よろしくお願いします。

  • C++ STL vectorの使い方

    こんばんは。 C++のstd::vectorに関する質問です。 vectorをポインタ渡しにしたときに メンバにアクセスする方法を知りたいのですが・・・ 以下ソースの☆の部分をどう記述したらよいでしょう? #include <vector> typedef struct test {  char name[10];  char id[2]; } TEST; void funcVectorTest( std::vector<TEST> *a); int main(){  std::vector<TEST> a;  int i;  TEST foo= {"Taro","0"};  a.push_back(foo);  printf("%s",a[0].name);  a.push_back(foo);  printf("%s",a[1].name);  funcVectorTest(&a);//vectorのアドレス渡しテスト  printf("%s", a[2].name);//vectorのアドレス渡し確認  return 0; } void funcVectorTest( std::vector<TEST> *a) {  int i;  int cnt;  TEST *b;  b = new TEST[3];  TEST foo= {"Taro","0"};  a->push_back(foo);  cnt = a->size();  for( i = 0; i < cnt;i++){  //以下でa[i]のnameにアクセスしたいのですがうまくいっていません。  //☆strcpy( b[i].name, a[i]->name );  }  delete[] b; } お分かりになる方、お知恵をお貸し下さい(><) vectorについて最近知ったばかりでいまいち使い方が 分かっていない部分があるので このやり方がまずいということであれば教えていただけると 助かります。 よろしくお願いしますm( _ _ )m

  • ベクトル

    aベクトル=(1,2,3) bベクトル=(-1,1,1) とする。 tを動かすとき、xベクトル=aベクトル+tbベクトルの 大きさ│xベクトル│の最小値を求めよ。 また、そのとき、xベクトルとaベクトルのなす角をθとするとき、 cosθの値を求めよ。 考えたのですがわかりません。 解説おねがいします。

このQ&Aのポイント
  • ムービーシアターを使って学校内限定のムービーを配信する際、著作権について注意が必要です。
  • 特に、収録BGMやムービーシアターを使って作成した動画には著作権が発生します。
  • 配信する際には、適切な権利処理を行い、ライセンスを取得する必要があります。
回答を見る