C ++矢量参考有趣

时间:2015-01-13 16:07:24

标签: c++ vector stl pass-by-reference

我编写了一个简单的c ++算法来计算向量的排列。如果我改变这13行

,下面的代码工作正常
vector<int>& pp = p.front();

到这个

vector<int> pp = p.front();

我无法理解为什么。我不认为这是由重新分配造成的。有人能解释一下吗

#include <vector>

using namespace std;

class Solution {
public:
    void f(vector<vector<int> >& p, vector<int>& num)
    {
        if (p.front().size() == num.size()) return;
        int k = p.size();
        while (k)
        {
            vector<int>& pp = p.front();
            for (int toAdd : num)
            {
                bool found = false;
                for (int i = 0; i < pp.size(); i++)
                {
                    if (pp[i] == toAdd)
                    {
                        found = true;
                        break;
                    }
                }
                if (!found)
                {
                    vector<int> newp;
                    for (int i = 0; i < pp.size(); i++)
                    {
                        newp.push_back(pp[i]);
                    }
                    newp.push_back(toAdd);
                    p.push_back(newp);
                }
            }
            p.erase(p.begin());
            k--;
        }
        f(p, num);
    }

    vector<vector<int> > permute(vector<int> &num)
    {
        vector<vector<int>> r;
        r.reserve(2 << num.size());
        for (int i = 0; i < num.size(); i++)
        {
            r.push_back(vector<int>());
            r[i].push_back(num[i]);
        }
        f(r, num);
        return r;
    }
};

int main()
{
    Solution s;
    vector<int> num{ 6, 3, 2, 7, 4, -1 };
    auto a = s.permute(num);
    a.clear();
    return 0;
}

1 个答案:

答案 0 :(得分:6)

这是因为这句话:

p.push_back(newp)

这使对向量p中条目的所有引用无效,因为它可以重新分配内容。