ホームページ > バックエンド開発 > C++ > C 11 で同時反復のための Python の Zip 機能を実現するにはどうすればよいでしょうか?

C 11 で同時反復のための Python の Zip 機能を実現するにはどうすればよいでしょうか?

Linda Hamilton
リリース: 2024-12-11 11:12:10
オリジナル
242 人が閲覧しました

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 の Combine および Zip Iterators

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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート