ホームページ >バックエンド開発 >C++ >C 11 で複数の範囲を含む Python の「zip」機能を実現するにはどうすればよいですか?

C 11 で複数の範囲を含む Python の「zip」機能を実現するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-13 17:18:11474ブラウズ

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 ライブラリは 2 つのメソッドを提供していました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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。