ホームページ > バックエンド開発 > C++ > Boost を使用して Python の Zip 関数を C で実装するにはどうすればよいですか?

Boost を使用して Python の Zip 関数を C で実装するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-13 06:56:12
オリジナル
386 人が閲覧しました

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

ブースト拡張範囲反復による C 11 でのシーケンス ジップの実装

C 11 の主要な拡張機能の 1 つは、範囲ベースの for-ループ、反復を簡素化する構文:

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 の Combine 関数を使用したソリューション

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);
    }
}
ログイン後にコピー

このコードprints:

4 7 a 4
5 8 b 5
6 9 c 6
ログイン後にコピー

カスタム範囲定義を使用したソリューション (Boost 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 に関する注意

1.63.0 (2016) より前の Boost バージョンの Boost の zip_iterator と boost::combine は未定義の動作を引き起こす可能性があることに注意してくださいまたは、入力コンテナの長さが異なる場合は反復が正しくありません。

以上がBoost を使用して Python の Zip 関数を C で実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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