C++ 对于C+中的每一个+;无法更新向量
我为每个for_指定了一个向量,并在for循环中更改了该向量。然而,当我运行程序时,在程序离开for循环后,向量仍然保持不变。是什么导致了这个问题?如果我仍然要使用for_each循环,我如何修复它 以下是代码(我的解决方案):C++ 对于C+中的每一个+;无法更新向量,c++,for-loop,foreach,C++,For Loop,Foreach,我为每个for_指定了一个向量,并在for循环中更改了该向量。然而,当我运行程序时,在程序离开for循环后,向量仍然保持不变。是什么导致了这个问题?如果我仍然要使用for_each循环,我如何修复它 以下是代码(我的解决方案): 类解决方案{ 公众: 无效打印(矢量t){ for(int a:t){ cout显示的代码显示未定义的行为 在for循环中: res.push_back(temp); 将新元素添加到std::vector会使该向量的所有现有迭代器无效(在本主题中有几种边缘情况
类解决方案{
公众:
无效打印(矢量t){
for(int a:t){
cout显示的代码显示未定义的行为
在for循环中:
res.push_back(temp);
将新元素添加到std::vector
会使该向量的所有现有迭代器无效(在本主题中有几种边缘情况,但它们在此处并不相关)。但是,这在for循环本身内部:
for(auto t:res){
for循环在向量上进行迭代。范围迭代在内部使用迭代器在容器上进行迭代。只要第一次推回
这里向向量添加了一个值,该for
-循环的下一次迭代是未定义的行为。游戏结束。显示的代码显示未定义的行为
在for循环中:
res.push_back(temp);
将新元素添加到std::vector
会使该向量的所有现有迭代器无效(在本主题中有几种边缘情况,但它们在此处并不相关)。但是,这在for循环本身内部:
for(auto t:res){
for循环在向量上进行迭代。范围迭代在内部使用迭代器在容器上进行迭代。只要第一次推回
在这里向向量添加了一个值,这个for
-循环的下一次迭代是未定义的行为。游戏结束。这里的问题是,您正在循环创建的子集然后在同一个循环中添加更多的子集,并附加它们
- 首先(正如Sam所指出的),
vector::push_back()
可能会使控制循环的迭代器失效,从而破坏代码
- 其次,即使在使用容器(例如
deque
或list
)时,push_back()
不会使任何指针无效,循环也会无限期地运行,因为您一直在添加新元素
正确的方法是只循环循环循环开始之前创建的子集,然后添加新子集,即将子集的数量增加一倍。实现这一点的最简单方法是使用良好的基于索引的循环,并在循环开始时分配/保留足够的子集(2^n)
vector<vector<int>> subsets(vector<int> const& nums)
{
const auto n=nums.size();
vector<vector<int>> subset(1<<n); // there are 2^n distinct subsets
for(size_t i=0,j=1; i!=n; ++i) // loop distinct nums
for(size_t k=j,s=0; s!=k; ++s) { // loop all subsets so far s=0..j-1
auto sset = subset[s]; // extract copy of subset
sset.push_back(nums[i]); // extend it by nums[i]
subset.at(j++) = move(sset); // store it at j
}
return subset;
}
向量子集(向量常量和nums)
{
const auto n=nums.size();
向量子集(1这里的问题是,您正在对迄今为止创建的子集进行循环,然后在同一循环中添加更多的子集,并附加它们。这有两个问题
- 首先(正如Sam所指出的),
vector::push_back()
可能会使控制循环的迭代器失效,从而破坏代码
- 其次,即使在使用容器(例如
deque
或list
)时,push_back()
不会使任何指针无效,循环也会无限期地运行,因为您一直在添加新元素
正确的方法是只循环循环循环开始之前创建的子集,然后添加新子集,即将子集的数量增加一倍。实现这一点的最简单方法是使用良好的基于索引的循环,并在循环开始时分配/保留足够的子集(2^n)
vector<vector<int>> subsets(vector<int> const& nums)
{
const auto n=nums.size();
vector<vector<int>> subset(1<<n); // there are 2^n distinct subsets
for(size_t i=0,j=1; i!=n; ++i) // loop distinct nums
for(size_t k=j,s=0; s!=k; ++s) { // loop all subsets so far s=0..j-1
auto sset = subset[s]; // extract copy of subset
sset.push_back(nums[i]); // extend it by nums[i]
subset.at(j++) = move(sset); // store it at j
}
return subset;
}
向量子集(向量常量和nums)
{
const auto n=nums.size();
向量子集(1Perhaps)将此转换为一个包含一些输入、预期输出和输出差异的函数。对正在迭代的容器进行变异可能会有问题,因为某些类型的变异会使迭代器无效(这是错误的)。您确定这是您的真实代码吗?res.reserve()
行将无法编译。可能会将其转换为一个包含一些输入、预期输出以及您的输出之间的差异。对正在迭代的容器进行变异可能会有问题,因为某些类型的变异会使迭代器无效(这是错误的)。您确定这是您的真实代码吗?res.reserve();
行无法编译。