Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对于C+中的每一个+;无法更新向量_C++_For Loop_Foreach - Fatal编程技术网

C++ 对于C+中的每一个+;无法更新向量

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会使该向量的所有现有迭代器无效(在本主题中有几种边缘情况

我为每个for_指定了一个向量,并在for循环中更改了该向量。然而,当我运行程序时,在程序离开for循环后,向量仍然保持不变。是什么导致了这个问题?如果我仍然要使用for_each循环,我如何修复它

以下是代码(我的解决方案):

类解决方案{
公众:
无效打印(矢量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();
行无法编译。