uns*_*ska 1 c++ copy vector 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];
Run Code Online (Sandbox Code Playgroud)
我正在尝试做一个递归循环,在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
Run Code Online (Sandbox Code Playgroud)
你只能移动到你触摸的方格,从0开始可以移动到1,4和5.从1到3,4,5,6等.
主要的想法是复制current_path到下一个函数调用(递归),这样就可以保持到那curren_path一点,直到它完全(10个步骤).它是从复制后current_path到all_paths我想我已经删除了current_path?
我知道如何有效地计算所有步骤,但我无法复制current_path和propably和我怎么添加current_path到all_paths当我在10级?
您的代码存在一些问题.在第4行的末尾,你有两个向量,每个向量包含10个空向量.您可以将其可视化为:
a = {{}, {}, {}, {}, {}, {}, {}, {}, {}, {}}
b = {{}, {}, {}, {}, {}, {}, {}, {}, {}, {}}
Run Code Online (Sandbox Code Playgroud)
那些内部向量仍然没有任何元素,所以当你尝试设置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;
Run Code Online (Sandbox Code Playgroud)
你可以这样做 b = a;
std::vector定义一个复制赋值运算符,它执行元素复制.这将调用内部向量的复制赋值运算符,该运算符复制ints.
代替
a.resize(10);
a[0][0] = 123;
Run Code Online (Sandbox Code Playgroud)
你会想做的
a.resize(10);
a[0].push_back(123);
Run Code Online (Sandbox Code Playgroud)
因为虽然resize在外部向量中创建了10个新向量,但这些内向量的长度为0,因此do a[0][0]会给出一个超过第一个内向量末尾的元素.
此外,只要您在堆栈上创建向量(就像您所做的那样),您就不需要删除任何内容; 他们有自动存储时间.