如何在Cython中将C结构映射到int的C++?
如何在Cython中将C结构体映射到整数类型的C++代码?
我尝试了以下代码:
main.py
#!/usr/bin/env python
# encoding: utf-8
import pyximport
pyximport.install()
from foo import Fun
Fun()
foo.pyx
#!/usr/bin/env python
# encoding: utf-8
from libcpp.map cimport map
from libcpp.string cimport string
cdef struct mystruct:
int i
def Fun():
cdef:
map[mystruct,int] dDict
mystruct A
A.i=1
dDict[A]=1
配置文件 foo.pyxbld
def make_ext(modname, pyxfilename):
from distutils.extension import Extension
return Extension(name=modname,
sources=[pyxfilename],
language='C++')
当我运行main.py时,出现了以下错误:
foo.cpp
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\INCLUDE\xlocale(342) : warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\INCLUDE\functional(143) : error C2784: 'bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem *)' : could not deduce template argument for 'const std::basic_string<_Elem,_Traits,_Alloc> &' from 'const __pyx_t_3foo_mystruct'
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\INCLUDE\string(150) : see declaration of 'std::operator <'
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\INCLUDE\functional(142) : while compiling class template member function 'bool std::less<_Ty>::operator ()(const _Ty &,const _Ty &) const'
with
[
_Ty=__pyx_t_3foo_mystruct
]
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\INCLUDE\map(68) : see reference to class template instantiation 'std::less<_Ty>' being compiled
with
[
_Ty=__pyx_t_3foo_mystruct
]
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\INCLUDE\xtree(22) : see reference to class template instantiation 'std::_Tmap_traits<_Kty,_Ty,_Pr,_Alloc,_Mfl>' being compiled
with
[
_Kty=__pyx_t_3foo_mystruct,
_Ty=int,
_Pr=std::less<__pyx_t_3foo_mystruct>,
_Alloc=std::allocator<std::pair<const __pyx_t_3foo_mystruct,int>>,
_Mfl=false
]
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\INCLUDE\xtree(63) : see reference to class template instantiation 'std::_Tree_nod<_Traits>' being compiled
with
[
_Traits=std::_Tmap_traits<__pyx_t_3foo_mystruct,int,std::less<__pyx_t_3foo_mystruct>,std::allocator<std::pair<const __pyx_t_3foo_mystruct,int>>,false>
]
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\INCLUDE\xtree(89) : see reference to class template instantiation 'std::_Tree_ptr<_Traits>' being compiled
with
[
_Traits=std::_Tmap_traits<__pyx_t_3foo_mystruct,int,std::less<__pyx_t_3foo_mystruct>,std::al
我应该如何正确初始化和使用这个映射呢?提前感谢你的帮助!
1 个回答
4
要在程序中使用以 mystruct
类型为键的映射(map),你需要为 mystruct
对象定义一个比较运算符。其实,C++ 的映射是有序的(通常是通过一些自动平衡的树结构来实现,比如 AVL 树或红黑树)。这样做的正确语法是:
cdef cppclass mystruct:
int i
bint lessthan "operator<"(const mystruct t) const:
return this.i < t.i
编辑:将 i < t.i
替换为 this.i < t.i
,因为这样更加明确(遵循 Python 的 Zen)。