首页 > 后端开发 > C++ > 如何在 C 11 中实现 Python 的多范围'zip”功能?

如何在 C 11 中实现 Python 的多范围'zip”功能?

Barbara Streisand
发布: 2024-12-13 17:18:11
原创
474 人浏览过

How Can I Achieve Python's `zip` Functionality with Multiple Ranges in C  11?

C 11 的 Sequence-zip 函数?

C 11 中基于范围的 for 循环在代码可读性和简洁性方面提供了显着改进。它允许您使用简化的语法迭代一系列元素,如下所示:

for (auto x : Y) {}
登录后复制

但是,此语法并不直接扩展到循环多个并发范围,如 Python 的 zip 函数。

Boost 解决方案

在 C 11 之前,Boost 库提供了两种方法来模拟 Python 的 zip功能:

Boost.Range.Combine:

#include <boost/range/combine.hpp>

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, a)) {
    int x, w;
    double y;
    std::string z;
    boost::tie(x, y, z, w) = tup;
    printf("%d %g %s %d\n", x, y, z.c_str(), w);
}
登录后复制

Boost.Iterator.ZipIterator:

#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);
}

std::vector<int> a {4, 5, 6};
double b[] = {7, 8, 9};
std::list<std::string> c {"a", "b", "c"};

for (auto tup : zip(a, b, c, a)) {
    int x, w;
    double y;
    std::string z;
    std::tie(x, y, z, w) = tup;
    printf("%d %g %s %d\n", x, y, z.c_str(), w);
}
登录后复制

以上是如何在 C 11 中实现 Python 的多范围'zip”功能?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板