C 11 で同時ループをシミュレートするための Zip 関数
C 11 での範囲ベースの for ループの導入により、要素のループが簡素化されます。コンテナ。ただし、複数のシーケンスを同時にループできる Python の zip 関数の機能を複製できるかどうかという疑問が生じます。
解決策
実現するにはいくつかのアプローチがあります。これは Boost ライブラリを使用しています:
アプローチ 1: Boost Combine (Boost 1.56.0 以降)
Boost 1.56.0 では boost::combine 関数が導入されました。異なるタイプの複数のコンテナを 1 つの範囲に結合できます:
#include <boost/range/combine.hpp> int main() { std::vector<int> a = {1, 2, 3}; std::vector<char> b = {'a', 'b', 'c'}; for (const auto& [x, y] : boost::combine(a, b)) { std::cout << x << " " << y << std::endl; } }
このコードは次のように出力します:
1 a 2 b 3 c
アプローチ 2: Boost Zip Iterator (以前の Boost バージョン)
Boost 1.56.0 より前、 boost::zip_iterator および boost::range ライブラリを使用してカスタム zip 範囲を実装できます:
#include <boost/iterator/zip_iterator.hpp> #include <boost/range.hpp> template <typename... T> auto zip(const T&&... 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); }
使用方法は同じです:
int main() { std::vector<int> a = {1, 2, 3}; std::vector<char> b = {'a', 'b', 'c'}; for (const auto& [x, y] : zip(a, b)) { std::cout << x << " " << y << std::endl; } }
以上がBoost を使用して C 11 で同時ループする Python の Zip 関数をシミュレートするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。