2012-11-26 53 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];