>백엔드 개발 >C++ >Boost를 사용하여 C에서 Python의 Zip 기능을 어떻게 구현할 수 있습니까?

Boost를 사용하여 C에서 Python의 Zip 기능을 어떻게 구현할 수 있습니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-13 06:56:12381검색

How Can I Implement Python's Zip Function in C   Using 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의 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);
    }
}

이 코드는 인쇄:

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에 대한 주의 사항

Boost 1.63.0(2016) 이전 버전에서 Boost의 zip_iterator 및 Boost::combine을 사용하면 정의되지 않은 동작이 발생할 수 있습니다. 또는 입력 컨테이너 길이가 다를 경우 잘못된 반복이 발생합니다.

위 내용은 Boost를 사용하여 C에서 Python의 Zip 기능을 어떻게 구현할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.