首页 >后端开发 >C++ >如何在 C 11 中实现 Python 的 Zip 功能以同时迭代?

如何在 C 11 中实现 Python 的 Zip 功能以同时迭代?

Linda Hamilton
Linda Hamilton原创
2024-12-11 11:12:10226浏览

How Can We Achieve Python's Zip Functionality for Simultaneous Iteration in C  11?

C 11 中用于顺序迭代的 Zip 函数

随着 C 11 中基于范围的 for 循环的引入,序列上的循环变得更加简洁。然而,同时循环多个序列带来了挑战。本文探讨了将 zip 样式功能合并到 C 11 代码中的解决方案。

Python 的 zip 函数提供了一种同时迭代多个列表的便捷方法,并对每个列表中的元素进行配对。我们可以使用新的 C 11 功能实现类似的行为吗?

Boost 的组合和 Zip 迭代器

在 Boost 1.56.0 中,可以使用 boost::combine 函数将多个范围组合成单个元组范围。每个元组元素对应于各自范围内当前位置的值。

#include <boost/range/combine.hpp>
#include <vector>
#include <list>

int main() {
    std::vector<int> a {4, 5, 6};
    double b[] = {7, 8, 9};
    std::list<std::string> c {"a", "b", "c"};
    for (auto tup : boost::combine(a, b, c)) {
        int x;
        double y;
        std::string z;
        boost::tie(x, y, z) = tup;
        printf("%d %g %s\n", x, y, z.c_str());
    }
}

Boost 还为此提供了 boost::zip_iterator 。在早期的 Boost 版本中,可以定义自定义 zip 函数来创建一系列元组。

#include <boost/iterator/zip_iterator.hpp>
#include <boost/range.hpp>

template <typename... T>
auto zip(T&&... containers) -> boost::iterator_range<boost::zip_iterator<decltype(boost::make_tuple(std::begin(containers)...))>>
{
    auto zip_begin = boost::make_zip_iterator(boost::make_tuple(std::begin(containers)...));
    auto zip_end = boost::make_zip_iterator(boost::make_tuple(std::end(containers)...));
    return boost::make_iterator_range(zip_begin, zip_end);
}

使用这些方法,我们可以有效地同时迭代多个序列,从而在 C 11 代码中实现类似 zip 的功能.

以上是如何在 C 11 中实现 Python 的 Zip 功能以同时迭代?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn