C++ std::views::zip 函数

2025 年 3 月 24 日 | 4 分钟阅读

在 C++23 中,ranges 库将有一个名为 zip 的算法,它接受两个或更多输入范围(例如,列表或向量)。在接收两个(或通常,任意数量的)范围后,zip_view 会生成一个元组的单个范围,每个元组都包含从每个输入范围中选择的一个元素。这使得可以方便地同时迭代多个序列而无需显式索引管理,就像您在 Python 中所期望的 zip 一样。它只使用范围中必要的部分,并且缓慢工作,不创建重复项。当有两个范围大小不同时,将选择较小的范围,并在最短的范围处结束迭代。规范是:观点:Zip 是处理配对数据或对集合进行并行工作时保持简单性和组织性的理想工具。

std::views::zip 的关键方面

C++ 中的 std::views::zip() 函数有几个关键方面。其中一些如下:

1. 命名空间和头文件

std::views::zip 是 ranges 库的一个组件,因此,为了使用它,必须包含以下头文件:

2. Zip 的功能

Zipping 或执行 zip 视图接受两个或更多范围,将输入范围的相应成员与元组的第 i 个成员匹配,并将多个范围折叠成一个。因此,它有助于同时处理多个范围,很像 Python 的 zipping。

3. 主要特点

  • 并行迭代:无需手动索引管理,您可以轻松地同时迭代两个或更多范围。
  • 元组:每个范围的单独项连接起来形成元组。
  • 惰性求值:在迭代期间,视图按需计算元素,而不是存储它们。

4. 用例

如果您想同时管理多个集合,std::views::zip 非常有用,例如:

  • 整合来自多个列表的元素并对其进行操作。
  • 在两个列表的元素对之间交替,无需手动索引维护。

示例 1

让我们举一个例子来说明 C++23 中的 std::views::zip() 函数。

输出

 
1 -> one
2 -> two
3 -> three
4 -> four   

示例 2

让我们再举一个例子来说明 C++23 中的 std::views::zip() 函数。

输出

 
Original Ranges:
IDs: 101 102 103 104 
Names: John Jane Jim Jake Jill 
Grades: A B C D E 

Zipped Data (ID, Name, Grade):
101 John A
102 Jane B
103 Jim C
104 Jake D
Modified Grades: a b c d E   

结论

在 C++23 中,一旦 zip 可用,合并两个或更多范围的最佳方法是同时迭代它们。在不是 C++23 的事件中,或者就此而言,当向后兼容性至关重要时,它是长长度选项。对于 show 等函数,使用模板将大大提高代码对不同类型容器的通用性和灵活性。一种方法是,即使您没有最新的语言功能,也可以执行一些相同的功能,例如同时处理多个范围和更改 对象。例如,转向更现代的 C++ 标准(例如 C++23)将使这些任务变得更加简单,但即使在较旧的标准中,也有各种替代方案。