3

多次元ベクトルのコピーに問題があります。多くのことを試しましたが、これが最後です。

vector < vector < int > > a;
vector < vector < int > > b;
a.resize(10);
b.resize(10);
a[0][0] = 123;
copy( a.begin(), a.end(), back_inserter(b) );
cout << b[0][0];

10回の移動でグリッド内のすべての可能なルートをカウントする再帰ループを実行しようとしています。current_path再帰ごとに現在のパスを保持するというベクトルを作成しようとしています。が10回移動すると、データがからにcurrent_pathコピーされます。current_pathall_paths

グリッドは次のようになります。

0  1  2 3
4  5  6 7
8  9  10 11
12 13 14 15

タッチしたマス目にのみ移動できるので、0から1、4、5に移動できます。1から3、4、5、6などに移動できます。

current_path主なアイデアは、を次の関数呼び出し(再帰的)にコピーしcurren_pathて、その時点まで保持し、いっぱいになるまで(10ステップ)実行することです。current_pathからにコピーした後、 ?all_pathsを削除する必要があると思います。current_path

すべてのステップを効率的に計算する方法を知っていますが、を適切にコピーするのに問題があり、10ステップのときにを追加するにcurrent_pathはどうすればよいですか?current_pathall_paths

4

3 に答える 3

10

コードにいくつかの問題があります。4行目の終わりまでに、それぞれが10個の空のベクトルを含む2つのベクトルがあります。あなたはそれを次のように視覚化することができます:

a = {{}, {}, {}, {}, {}, {}, {}, {}, {}, {}}
b = {{}, {}, {}, {}, {}, {}, {}, {}, {}, {}}

これらの内部ベクトルにはまだ要素がないため、に設定しようとするとa[0][0]123存在しない要素にアクセスし、未定義の動作を呼び出します。

それがうまくいった場合、あなたの使用std::copyは単に各ベクトルをからコピーしa、それをの後ろにプッシュするでしょうb。すでに10個の要素があるためb、20個の要素になります。

次に、b[0][0]存在しないものと同じくらい存在しないものを出力しようとしa[0][0]ます。

ここでの解決策は、次のように定義されたコピー代入演算子を使用することですstd::vector

vector<vector<int>> a = {{1, 2, 3}, {4, 5}};
vector<vector<int>> b;
b = a;
于 2012-11-26T19:26:49.947 に答える
6

あなたはただすることができますb = a;

std::vector要素ごとのコピーを行うコピー代入演算子を定義します。これにより、sをコピーする内部ベクトルのコピー代入演算子が呼び出されますint

それ以外の

a.resize(10);
a[0][0] = 123;

あなたはしたいと思うでしょう

a.resize(10);
a[0].push_back(123);

なぜならresize、外側のベクトルに10個の新しいベクトルを作成する一方で、これらの内側のベクトルの長さは0であるため、そうするとa[0][0]、最初の内側のベクトルの終わりを1つ超えた要素が得られます。

また、(行ったように)スタック上にベクターを作成する限り、何も削除する必要はありません。自動保存期間があります。

于 2012-11-26T19:21:54.807 に答える
2

コードの修正バージョンは次のとおりです。

vector < vector < int > > a;
vector < vector < int > > b;
a.resize(10, vector < int >(10));
b.resize(10, vector < int >(10));
a[0][0] = 123;
b = a;
cout << b[0][0];
于 2012-11-26T19:29:24.240 に答える