在 for 循环中解包 Vector/Set
Posted
技术标签:
【中文标题】在 for 循环中解包 Vector/Set【英文标题】:Unpacking Vector/Set in for loop 【发布时间】: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 个答案(可能是因为这些版本没有解决方案)。 好的,我会添加 【参考方案1】:是的,但不是vector<vector<int>>
,因为(内部)向量的大小在编译时是未知的。你需要std::vector<std::pair<int, int>>
:
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以上是关于在 for 循环中解包 Vector/Set的主要内容,如果未能解决你的问题,请参考以下文章
在 for 循环中使用 str.split 时出现“ValueError 太多值无法解包”
python学习手册:第十三章——while循环和for循环