首页 >后端开发 >C++ >如何使用Boost在C中实现Python的Zip函数?

如何使用Boost在C中实现Python的Zip函数?

Linda Hamilton
Linda Hamilton原创
2024-12-13 06:56:12384浏览

How Can I Implement Python's Zip Function in C   Using Boost?

通过 Boost 增强型范围迭代在 C 11 中实现序列压缩

C 11 的关键增强功能之一是基于范围的 -循环,简化迭代语法:

for(auto x: Y) {}

这个与以前的语法相比是一个显着的改进:

for(std::vector<int>::iterator x=Y.begin(); x!=Y.end(); ++x) {}

问题出现了:这种简化的语法是否可以扩展到循环多个同时序列,类似于 Python 的 zip 函数?

Y1 = [1, 2, 3]
Y2 = [4, 5, 6, 7]
for x1,x2 in zip(Y1, Y2):
    print(x1, x2)

这段代码输出:

(1,4) (2,5) (3,6)

Boost 组合的解决方案函数

在 Boost 版本 1.56.0 及更高版本(2014)中,可以使用 boost::combine 函数:

#include <boost/range/combine.hpp>

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

此代码打印:

4 7 a 4
5 8 b 5
6 9 c 6

具有自定义范围定义的解决方案(预升压1.56.0)

在早期的 Boost 版本中,需要定义自定义范围:

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

template <typename... T>
auto zip(T&amp;&amp;... 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);
}

用法保持不变。

注意对于 Boost 的 Zip Iterator

请注意,Boost 的如果输入容器长度不同,1.63.0 (2016) 之前的 Boost 版本中的 zip_iterator 和 boost::combine 可能会导致未定义的行为或不正确的迭代。

以上是如何使用Boost在C中实现Python的Zip函数?的详细内容。更多信息请关注PHP中文网其他相关文章!

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