#include <iostream>
#include <vector>
using namespace std;
void printMatrix(vector<vector<int> >& m) {
for (int i = 0; i < m.size(); ++i) {
cout << "{" << m[i][0];
for (int j = 1; j < m[i].size(); ++j) {
cout << "," << m[i][j];
}
cout << "}\n";
}
cout << "************************\n";
}
vector<vector<int> > getClimbs(int n) {
vector<vector<int> > first = {{1}};
if (n==1) return first;
vector<vector<int> > second = {{1,1}, {2}};
if (n==2) return second;
vector<vector<int> >& one = first;
vector<vector<int> >& two = second;
vector<vector<int> > res;
for (int i = 3; i <= n; ++i) {
res.clear();
for (int j = 0; j < one.size(); ++j) {
one[j].push_back(2);
res.push_back(one[j]);
}
for (int j = 0; j < two.size(); ++j) {
//cout << "two[0] " << two[j][0] << "\n";
two[j].push_back(1);
//cout << "two[1] " << two[j][1] << "\n";
//cout << "size : " << two[j].size() << "\n";
res.push_back(two[j]);
//cout << "size : " << res.back().size() << "\n";
//printMatrix(res);
two[j].pop_back();
}
one = two;
two = res;
}
return res;
}
int main() {
vector<vector<int> > res = getClimbs(2);
printMatrix(res);
res = getClimbs(3);
printMatrix(res);
res = getClimbs(4);
printMatrix(res);
res = getClimbs(5);
printMatrix(res);
}
上面的代码工作正常。但是,如果你观察到,我在getClimbs()中使用两个引用,一个和两个。我的疑问是,我在迭代结束时执行两次= res,然后在下一次迭代开始时执行res.clear()。现在,由于两个是res的引用,它应该指向一个空容器。但是,这不会发生。即使清除了res,我也可以访问res中的所有元素。 有谁知道为什么?
请注意,如果没有循环,这不会发生,我只是做了两个= res后跟res.clear(),然后两个指向一个空容器。
答案 0 :(得分:1)
two
不是对res
的引用。它是对second
:
vector<vector<int>>& two = second;
永远不会重新分配引用,所以行:
two = res;
将调用赋值运算符并将res
的内容复制到two
(second
的别名)。
答案 1 :(得分:1)
您不能像这样重新绑定引用变量。相反,实际发生的事情是你调用了复制构造函数将res
向量复制到引用的two
中(在这种情况下为second
)。
因此,您实际上将second
向量替换为res
向量的副本。