2011-02-09 2 views
4

나는 인자 또는 반환 값으로 std::set<std::string>을 가진 C++ 메소드가 있습니다. 이것을 파이썬 frozenset (또는 일반 set)에 매핑하고 싶습니다. 그러나 이것을 수행하는 간단한 방법이없는 것처럼 보입니다. 누구든지이 작업을 수행하는 방법을 알고 있습니다.Boost Python으로 frozenset을 만들고 액세스하십시오.

답변

0

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++ 함수를 래핑하십시오.

예, 이것은 디자인 미학 관점에서 보면 다소 어리 석으며 세계에서 가장 뛰어난 코드는 아니지만 최소한의 코드로 어디로 갈지를 알 수 있으며 상당히 견고합니다.

+0

두 번째 옵션은 현재 내가하고있는 일이지만 실제로 좋고 깨끗한 것은 아닙니다 ... 색인 생성 프로그램 버전 2를 사용해 볼 수 있습니다. –

0

std::set<YourType> 대신 std::map<YourType, int>을 사용할 수 있습니다. 예를 들어, 0 일 수 있습니다. std :: map은 std :: set와 동일한 삽입/검색 시간 복잡성을 가지며 주문 된 키를 유지하며 팽창 만합니다. 조금 메모리. 그럼 당신은지도 색인 스위트를 사용할 수 있습니다 파이썬에서 당신이 필요하면 일부 래퍼 클래스의 차이를 숨길 수 있습니다. 단점은 기존 C++ 코드를 약간 수정해야한다는 것입니다.