나는 인자 또는 반환 값으로 std::set<std::string>
을 가진 C++ 메소드가 있습니다. 이것을 파이썬 frozenset
(또는 일반 set
)에 매핑하고 싶습니다. 그러나 이것을 수행하는 간단한 방법이없는 것처럼 보입니다. 누구든지이 작업을 수행하는 방법을 알고 있습니다.Boost Python으로 frozenset을 만들고 액세스하십시오.
답변
Boost.Python의 표준은 std::set
을 지원하지 않습니다. 모든 stl 컨테이너에서 작동하는 indexing_suite v2가 있습니다. (http://mail.python.org/pipermail/cplusplus-sig/2009-July/014704.html)
공식 배포판으로 만들지는 않았지만 주위에 묻어서 찾을 수 있습니다. (http://mail.python.org/pipermail/cplusplus-sig/2009-July/014691.html)
나는 다음 원래indexing_suite
을 사용하기 어렵게 될 것이 아니라, 그것은 당신의 요구에 맞게 수 발견
.
그래도 작동하지 않으면 다른 클래스와 마찬가지로 수동으로 std::set<std::string>
을 감쌀 수 있습니다. 이렇게하면 std::set<std::string>
을 파이썬으로 가져올 수 있습니다. 파이썬은 파이썬 set
으로 쉽게 변환 할 수 있습니다.
둘 다 더 많은 작업이 필요하다고 생각합니다.
먼저 동일한 서명이 있지만 반환 된 데이터를 std::set<std::string>
대신 std::vector<std::string>
에 채우는 기능으로 C++에서 함수를 래핑하십시오. 원래보다는 오히려 그 기능을 노출하십시오
이제 파이썬으로 데이터를 얻었습니다.
둘째, std::vector<std::string>
의 데이터를 가져 와서 파이썬 set
에 채우는 파이썬 함수에서 C++ 함수를 래핑하십시오.
예, 이것은 디자인 미학 관점에서 보면 다소 어리 석으며 세계에서 가장 뛰어난 코드는 아니지만 최소한의 코드로 어디로 갈지를 알 수 있으며 상당히 견고합니다.
std::set<YourType>
대신 std::map<YourType, int>
을 사용할 수 있습니다. 예를 들어, 0 일 수 있습니다. std :: map은 std :: set와 동일한 삽입/검색 시간 복잡성을 가지며 주문 된 키를 유지하며 팽창 만합니다. 조금 메모리. 그럼 당신은지도 색인 스위트를 사용할 수 있습니다 파이썬에서 당신이 필요하면 일부 래퍼 클래스의 차이를 숨길 수 있습니다. 단점은 기존 C++ 코드를 약간 수정해야한다는 것입니다.
두 번째 옵션은 현재 내가하고있는 일이지만 실제로 좋고 깨끗한 것은 아닙니다 ... 색인 생성 프로그램 버전 2를 사용해 볼 수 있습니다. –