首頁 > 後端開發 > C++ > 如何使用Boost在C中實作Python的Zip函數?

如何使用Boost在C中實作Python的Zip函數?

Linda Hamilton
發布: 2024-12-13 06:56:12
原創
385 人瀏覽過

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

透過 Boost 增強型範圍迭代在 C 11 中實現序列壓縮

C 11 的關鍵增強功能之一是基於範圍的關鍵增強功能之一是基於範圍的關鍵增強功能之一-循環,簡化迭代語法:

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 組合的解函數

在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);
    }
}
登入後複製

此程式碼列印:

4 7 a 4
5 8 b 5
6 9 c 6
登入後複製

具有自訂範圍定義的解(預升壓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

請注意,Boost 的如果輸入容器長度不同,1.63.0 (2016) 之前的Boost 版本中的zip_iterator 和boost ::combine 可能會導致未定義的行為或不正確的迭代。

以上是如何使用Boost在C中實作Python的Zip函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板