Cython должен автоматически конвертировать набор C++ в набор python, если это необходимо, однако если вам действительно нужно использовать итераторы на объекте C++, вы можете это сделать.
Если мы делаем очень простой пример, когда мы построим множество в C++
libset.cc
#include <set>
std::set<int> make_set()
{
return {1,2,3,4};
}
libset.h
#include <set>
std::set<int> make_set();
Затем мы можем написать оболочка cython для этого кода, где я привел пример того, как итерации через набор в хороший питонический путь (который использует итераторы C++ в фоновом режиме) и пример того, как это сделать непосредственно с итераторами.
pyset.pyx
from libcpp.set cimport set
from cython.operator cimport dereference as deref, preincrement as inc
cdef extern from "libset.h":
cdef set[int] _make_set "make_set"()
def make_set():
cdef set[int] cpp_set = _make_set()
for i in cpp_set: #Iterate through the set as a c++ set
print i
#Iterate through the set using c++ iterators.
cdef set[int].iterator it = cpp_set.begin()
while it != cpp_set.end():
print deref(it)
inc(it)
return cpp_set #Automatically convert the c++ set into a python set
Это может быть скомпилирован с помощью простого setup.py
setup.py
from distutils.core import setup, Extension
from Cython.Build import cythonize
setup(ext_modules = cythonize(Extension(
"pyset",
sources=["pyset.pyx", "libset.cc"],
extra_compile_args=["-std=c++11"],
language="c++"
)))
Не имеет ли на C++ класс своего итератора? – hpaulj
Да, но я не знаю, как его вызывать. Я пробовал несколько вещей, и никто не работал. Сам набор файлов классов определяет итератор в определении класса, но я не знаю, как его получить. – ReverseFlow
Является ли эта секция доктором для любого использования: http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html#standard-library – hpaulj