C++ 向量参考作品很有趣

C++ vector reference works funny

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

下面的代码工作正常
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;
}

是因为这句话:

p.push_back(newp)

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