首頁 >後端開發 >C++ >如何在 C 11 中實現 Python 的 Zip 功能以同時迭代?

如何在 C 11 中實現 Python 的 Zip 功能以同時迭代?

Linda Hamilton
Linda Hamilton原創
2024-12-11 11:12:10223瀏覽

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 的組合和 Zip 迭代器

在 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn