C ++复制多维向量

时间:2012-11-26 19:18:04

标签: c++ vector copy multidimensional-array

我在复制多维向量时遇到问题,我尝试了很多东西,但这是最后一个:

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复制到{{1 }}

网格是这样的:

all_paths

你只能移动到你触摸的方格,从0开始可以移动到1,4和5.从1到3,4,5,6等等。

主要思想是将0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 复制到下一个函数调用(递归),这样它就会保持current_path到那一点,直到它完整(10步)为止。从curren_path复制到current_path后,我想我必须删除all_paths

我知道如何有效地计算所有步骤,但我在复制current_path方面遇到了问题,而且当我处于10步时,如何将current_path添加到current_path

3 个答案:

答案 0 :(得分: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; 定义的复制赋值运算符:

{{1}}

答案 1 :(得分:6)

您可以b = a;

std::vector定义了copy assignment operator,它执行元素复制。这将调用内部向量的复制赋值运算符,该运算符复制int s。

而不是

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

你想要做

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

因为虽然resize在外部向量中创建了10个新向量,但这些内向量的长度为0,因此执行a[0][0]将为您提供一个超过第一个内向量末尾的元素。

此外,只要您在堆栈上创建向量(就像您所做的那样),您就不需要删除任何内容;他们有automatic storage duration

答案 2 :(得分: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];