[ad_1]
プロセスは不正な終了コードで終了します。
#include <iostream> #include <vector> using namespace std; vector<int> merge_sorted(vector<int> a, vector<int> b) { for (int i = 0; i < a.size()+b.size(); i++) { a.push_back(b[i]); } return a; } int main() { vector <int> vec1 = {3, 5, 7, 12, 16, 19}; vector <int> vec2 = {5, 10, 36, 48, 77}; vector <int> final = merge_sorted(vec1, vec2); for (int i = 0; i < final.size(); i++) { cout << final[i] << " "; } cout << endl << final.size(); return 0; }
私が試したこと:
置く
return a;
関数 for ループの下で、vec2 からの 1 つの値のみが vec1 に追加されます。
解決策 1
内部のループを見てみましょう merge_sorted()
:
C++
for(int i = 0; i < a.size() + b.size(); ++i) a.push_back(b[i]);
ここには 2 つの問題があります。
1 つ目は、ループ テストに到達するたびに終了条件を再計算することです。 ベクトル a で push_back() を継続的に呼び出しているため、常に成長しており、テストは常に true になります。 最終的に、ベクターのスペースが不足し、プログラムがクラッシュします。
2 つ目は、テストそのものです。 の値であっても a.size() + b.size()
は 1 回しか計算されていないため、正しくありません。 プッシュしたいだけです b.size()
要素を a に変換するため、テストはおそらく i < b.size()
しかし、これは「古い学校」の C++ プログラミングです。 C++11 以降のコンパイラを使用している場合は、範囲ベースの for ループを使用できます。
C++
for(auto i : b) a.push_back(i);
これにアプローチする別の方法は、 vector::insert()
C++
a.insert(a.end(), b.begin(), b.end())l
ここでベクトルクラスのドキュメントを必ず見てください。 std::vector – cppreference.com[^]
[ad_2]
コメント