2012-11-26 103 views
1

我有複製多維向量的問題,我已經嘗試了很多東西,但是這是最後一個:C++複製多維向量

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和propably錯誤,如何在10步時將current_path添加到all_paths

+0

這裏的回答類似的問題我回答昨天,只需用數字填充矢量並按照需要的方式更改數字http://stackoverflow.com/questions/13552430/matrix-adjacent-elements-combinations-in-c/13552643#13552643 – hinafu

回答

8

你的代碼有幾個問題。在第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; 
+0

你似乎是正確的。我將它們都轉換爲一維數組,並且工作。我在這裏有點困惑。我瞭解調整大小錯誤嗎?因爲我可以做[0] [100] = 123,所以我認爲這讓我有10列N列。和[9] [10000] = 123; 我看到雅克已經解釋了這一點。 – unska

+0

'a'是一個'vector'。調整一個'vector'的大小會給它* N *個默認的初始化元素。 'a'的每個元素都是'vector',當它們被默認初始化時,它們是空的。所以調整'a'會給你10個空的'矢量'。 –

5

你可以做b = a;

std::vector定義copy assignment operator這確實的元素單元的副本。這將調用內部向量的複製賦值操作符,該向量複製int。取而代之的

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

你會想要做

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

因爲雖然resize外載體創建10個新的載體,這些內部向量具有長度爲0,這樣a[0][0]會給你一個元素超過第一個內部向量的末尾。另外,只要你在棧上創建矢量(就像你已經完成的那樣),你將不需要刪除任何東西;他們有automatic storage duration

+0

我試過了,但它不起作用,它只是克給我隨機數。 vector > a; a.resize(1); a [0] [0] = 123; vector > b = a; cout << b [0] [0]; – unska

+0

我已經添加了爲什麼發生在我的答案。 – Dan

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