2017-12-30 4 views
-2

このコードを実行すると、次のようなことが起こります:セグメンテーションフォールト(コアダンプ) コードを変更する必要はありますか?セットと配列をC++でベクターにマージするには

#include<iostream> 
#include<set> 
#include<vector> 
#include<algorithm> 

using namespace std; 

int main(){ 

    int *even=new int[100]; 

    int *temp=new int[100]; 

    for(int i=0;i<100;i++){ 
     even[i]=2*i+2; 
     temp[i]=2*i+1; 
    } 
    set <int,less<int> > odd(temp,temp+100); 

    vector <int> vec; 

    merge(even, even+100,odd.begin(), odd.end(), vec.begin()); 

    for(int i=0;i<100;i++){ cout<<"merged vector is:" <<vec[i]<<endl; 

    } 
    return 0; 
} 
+2

奇数のサイズの合計にベクトルのサイズを変更しても、またはSTDを使用:: back_inserier –

+0

好奇心なぜあなたは生の配列を割り当てているだけではなく、一時的のための 'のstd :: vector'sを使用してストレージ。 'temp 'の割り当てが失敗すると' even'が漏れます。 – Mgetz

答えて

1

vec空で、mergeは、通常のイテレータを介してのサイズを変更する(することはできません)しません。
これはstd::back_inserterが発明された理由である - それは、要素を追加するpush_backを使用して「イテレータ」です:あなたは、結果の大きさを知っているので、あなたも「プレサイズ」缶

merge(even, even+100, odd.begin(), odd.end(), back_inserter(vec)); 

vecと現在を使用方法:

vector <int> vec(100 + odd.size()); 
merge(even, even+100, odd.begin(), odd.end(), vec.begin()); 
0

変更vector<int> vec; vector <int> vec (100+odd.size());

関連する問題