簡體   English   中英

C++ 復制多維向量

[英]C++ copying multidimensional vector

我在復制多維向量時遇到問題,我嘗試了很多方法,但這是最后一個:

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的向量,它將保存每個遞歸的當前路徑,當current_path有 10 次移動時,它會將數據從current_path復制到all_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

我知道如何有效地計算所有步驟,但是我在復制current_path遇到了麻煩, all_paths在我執行 10 個步驟時如何將current_path添加到all_paths

您的代碼存在一些問題。 在第 4 行的末尾,您有兩個向量,每個向量包含 10 個空向量。 你可以像這樣想象它:

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

這些內部向量仍然沒有任何元素,因此當您嘗試將a[0][0]123 ,您正在訪問一個不存在的元素,從而調用未定義的行為。

如果這樣做有效,您使用std::copy將簡單地從a復制每個向量並將其推送到b的后面。 因為b已經有 10 個元素,所以它現在有 20 個元素。

然后嘗試輸出b[0][0]不存在絲毫不亞於a[0][0]確實沒有。

這里的解決方案是簡單地使用std::vector定義的復制賦值運算符:

vector<vector<int>> a = {{1, 2, 3}, {4, 5}};
vector<vector<int>> b;
b = a;

你可以只做b = a;

std::vector定義了一個復制賦值運算符,它進行元素復制。 這將調用內部向量的復制賦值運算符,它復制int s。

代替

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

你會想做

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

因為雖然resize在外部向量中創建了 10 個新向量,但這些內部向量的長度為 0,因此執行a[0][0]將為您提供一個超出第一個內部向量末尾的元素。

此外,只要您在堆棧上創建向量(正如您所做的那樣),您就不需要刪除任何內容; 他們有自動存儲期限

這是您的代碼的固定版本:

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];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM