【问题标题】:what happened in this auto loop?在这个自动循环中发生了什么?
【发布时间】:2015-10-09 20:29:55
【问题描述】:
vector<int> nums = {1, 2, 3};
vector<vector<int>> subsets = {{}};
for(int i=0; i<3; i++)
    for(auto subset : subsets)
    {
        subset.push_back(nums[i]);
        subsets.push_back(subset);
    }

subsets的内容,运行后竟然是:

[[] [1] [2] [2] [3] [3] [3] [3]]

但是,我期待:

[[] [1] [2] [1 2] [3] [1 3] [2 3] [1 2 3]]

似乎只考虑第一个元素,即空的vector&lt;int&gt;

您能否告诉我在内存分配方面到底发生了什么?

PS:我也将subsets.push_back(subset) 更改为subsets.push_back(vector&lt;int&gt;(subset)),但仍然给出相同的错误结果。

【问题讨论】:

  • UB。您的 subsets.push_back 调用使基于范围的 for 循环使用的迭代器无效。
  • @T.C.你能更准确一点吗?你的意思是,在subsets.push_back(subset) 之后,auto for 循环终止了吗?
  • 在 UB 之后任何事情都可能发生。

标签: c++ c++11 memory-management


【解决方案1】:

有一些事情不会按预期工作:

for(auto subset : subsets) 说“给我一个元素的可修改副本。” 将auto 更改为auto&amp; 以接收可修改的引用

基于范围的 for 循环旨在用于查看恒定范围的元素。如果您修改范围,迭代器将失效。请改用标准的 for 循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 2018-08-12
    相关资源
    最近更新 更多