【问题标题】:Unpacking Vector/Set in for loop在 for 循环中解包 Vector/Set
【发布时间】:2022-01-24 06:48:34
【问题描述】:

就像在 Python 中一样,我们可以在 for 循环中解压列表列表,如下所示:

coordinates = [[2,2], [5,99]]
for x, y in coordinates:
    print(x+y)

在 C++ 中,有没有办法对向量/向量集/集合做同样的事情? 有点像

vector<vector<int>> coordinates {{2,3}, {5,99}};
for(auto x, y : coordinates)
    cout << x+y;

如果有人能提供多个 c++ 版本的解决方案,那就更好了。

【问题讨论】:

  • 你应该选择一个特定的标准,因为c++11/c++14和c++17的答案会有很大的不同。
  • 其实,在不同的 c++ 版本中单独解决这样的问题不是很棒吗?它甚至会提高堆栈溢出的答案质量。任何想知道这一点但使用不同版本的人都会在这里得到安抚。
  • 如果您想要多个 C++ 版本的答案,请在您的问题中澄清,以便答案开始包括所有 C++ 版本的解决方案。目前,用户会寻找这个并看到一个关于 c++11 的问题,并且只找到 c++17 的答案,所以这对其他用户来说并不是很好。当您使用多个版本标签时,人们会选择他们认为最合适的一个,他们不会尝试解决所有版本,正如您所看到的,因为所有的答案都是 C++17,没有 C++11/C+ +14 个答案(可能是因为这些版本没有解决方案)。
  • 好的,我会添加

标签: c++ c++17


【解决方案1】:

是的,但不是vector&lt;vector&lt;int&gt;&gt;,因为(内部)向量的大小在编译时是未知的。你需要std::vector&lt;std::pair&lt;int, int&gt;&gt;:

std::vector<std::pair<int, int>> coordinates {{2,3}, {5,99}};
for(auto [x,y] : coordinates)
    cout << x+y;

【讨论】:

    【解决方案2】:

    我在您的 Q 中看到您要求解压缩列表列表(如在 Python 中)。您可以通过在向量中使用std::array(而不是std::pair)来改进@bolov 的答案,以便在您的内部容器中包含任意数量的元素:

    std::vector<std::array<int, 3>> coordinates{ {2,3,4}, {5,99,23} };
    for (auto[x, y, z] : coordinates)
       std::cout << x + y + z;
        
    std::cout << "Hello World!\n"; 
    

    【讨论】:

    • 使用数组代替对有什么改进?特别是,为什么我们现在每组有 3 个参数,而 OP 明确要求 2...
    • @Gupta 这似乎不像对博洛夫的回答有所改进。请说明,这对 bolov 的回答有何改进?
    • @Klaus 原始问题指的是python中的列表列表,即内部列表中的元素数量没有限制。虽然 bolov 的回答是合理的,但在他/她的回答中,内部容器(即 pair)里面只能有两个元素。所以,我提出了这个解决方案来稍微放宽这个限制。
    • @AanchalSharma 正如评论中提到的克劳斯。
    • 如果你真的想要一个类似 python 的列表,唯一有效的类型是 std::tuple 的 std::array :-) 但我不相信这一切都很有帮助:-)
    猜你喜欢
    • 1970-01-01
    • 2012-06-07
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 2012-12-15
    相关资源
    最近更新 更多