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
,因为它可以重新分配内容。
我编写了一个简单的 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
,因为它可以重新分配内容。