ランタイムエラーを引き起こしている原因がわからないです。
どの点を修正することで、ランタイムエラーを解決できるのかを教えていただきたいです
###発生しているエラー
C++
1Line 924: Char 9: runtime error: reference binding to null pointer of type 'int' (stl_vector.h) 2SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/stl_vector.h:933:9
###要件定義
-
2つのソートされた整数配列nums1とnums2が与えられた場合、nums2を1つのソートされた配列としてnums1にマージします。
-
nums1およびnums2で初期化される要素の数は、それぞれmおよびnです。
-
nums1には、nums2からの追加の要素を保持するのに十分なスペース(m + n以上のサイズ)があると想定できます。
###関数呼び出し時に使われる値
nums1 = [1,2,3,0,0,0]
nums2 = [2,5,6]
n=3
m=3
###期待される答え
nums1 = [1,2,2,3,5,6]
###エラーを起こすコード
C++
1class Solution { 2public: 3 void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) { 4 5 int n1=0; 6 int n2=0; 7 8 vector<int>tmp; 9 10 while(n1<nums1.size()){ 11 12 if(tmp.size()==0){ 13 14 if(n1>=m){ 15 //nums1が、初期値を指定された値を超えたとき [1,2,3,0,0,0] の3を超えて0になった時、nums2をただnums1に入れていく 16 nums1[n1]=nums2[n2]; 17 18 //n1とn2を次に進める 19 n1++; 20 n2++; 21 22 }else if(nums1[n1]>nums2[n2]){ 23 //1の方が大きいから2をリストnums1に挿入 24 //nums1 = [1,2,3,0,0,0] 25 //nums2 = [2,5,6] 26 //nums1の3とnums2の2を比べて、まずは、nums1[2]をtmpにkeepして、nums2[0]をnums1[2]に代入 27 28 if(n1<m){ 29 //tmpに保存 30 tmp.push_back(nums1[n1]); 31 } 32 33 //小さいnums2の値をnums1に上書き 34 nums1[n1]=nums2[n2]; 35 36 //n1とn2を次に進める 37 n1++; 38 n2++; 39 40 }else if(nums1[n1]<=nums2[n2]){ 41 //nums1 = [1,2,3,0,0,0] 42 //nums2 = [2,5,6] 43 //nums1の3とnums2の5では、nums1の方が小さいので、 44 //list nums1は変更せず、n1++をする 45 n1++; 46 } 47 }else{ 48 //tmp.size()!=0 49 //つまり、vectorに保管してる 50 51 if(n2==n-1){ 52 //もしnums2にもう要素が残っていないのなら、tmpに入っている値をnums1に挿入 53 nums1[n1]=tmp[0]; 54 55 //tmpのheadを削除する。 56 tmp.erase(tmp.begin()); 57 n1++; 58 59 //tmpは、上書きされる前に退避させたn1の値だから tmpとn2を比較する 60 }else if(tmp[0]>nums2[n2]){ 61 //n2の方が小さいということは、nums2をnums1に上書きする 62 //そのため、nums1の値が消えてしまうので、tmpに退避させとく 63 tmp.push_back(nums1[n1]); 64 //上書き 65 nums1[n1]=nums2[n2]; 66 n1++; 67 n2++; 68 69 }else if(tmp[0]<=nums2[n2]){ 70 //tmpの方がnums2より小さいときは、 71 //vectorの先頭の値をnums1に上書きする 72 73 //n1がmより小さいときは、上書きされるn1をtmpに退避させる 74 //nums1 = [1,2,3,0,0,0] mとは、nums1[2]まで、 75 //nums2 = [2,5,6] 76 77 if(n1<m){ 78 tmp.push_back(nums1[n1]); 79 }else{ 80 //0を上書きする場合は、0をtmpに退避させる必要はない 81 } 82 nums1[n1]=tmp[0]; //nums1から一度tmpに退避したが、h再び、nums1の順序順のindexに戻した 83 //tmpのheadを削除する。 84 tmp.erase(tmp.begin()); 85 n1++; 86 } 87 } 88 } 89 } 90}; 91 92
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/22 00:52
2020/06/22 00:57
2020/06/22 01:11