【解決方法】ベクトルマージ関数からベクトルを返す方法


プロセスは不正な終了コードで終了します。

#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[^]

コメント

タイトルとURLをコピーしました