我在复制多维向量时遇到问题,我尝试了很多东西,但这是最后一个:
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
?
答案 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];