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将保存每次递归的当前路径,当current_path10 次移动时,它会将数据从 复制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 个空向量。你可以像这样想象它:

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

这些内部向量仍然没有任何元素,因此当您尝试设置a[0][0]为 时123,您正在访问一个不存在的元素,从而调用未定义的行为。

如果这行得通,您的使用std::copy将简单地复制每个向量 froma并将其推到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;
于 2012-11-26T19:26:49.947 回答
6

你可以做b = a;

std::vector定义了一个按元素进行复制的复制赋值运算符。这将调用内部向量的复制赋值运算符,它复制ints。

代替

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

你会想做

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

因为虽然resize在外部向量中创建了 10 个新向量,但这些内部向量的长度为 0,所以这样做a[0][0]会给你一个超过第一个内部向量末尾的元素。

此外,只要您在堆栈上创建向量(就像您所做的那样),您就不需要删除任何东西;他们有自动存储期限

于 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 回答