矢量清除循环中参考的效果

时间:2015-03-20 17:58:25

标签: c++ vector stl

#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(),然后两个指向一个空容器。

2 个答案:

答案 0 :(得分:1)

two 是对res的引用。它是对second

的引用
vector<vector<int>>& two = second;

永远不会重新分配引用,所以行:

two = res;

将调用赋值运算符并将res的内容复制到twosecond的别名)。

答案 1 :(得分:1)

您不能像这样重新绑定引用变量。相反,实际发生的事情是你调用了复制构造函数将res向量复制到引用的two中(在这种情况下为second)。

因此,您实际上将second向量替换为res向量的副本。