2013-10-08 10 views
7

Cython gibt uns eine einfache Möglichkeit, C++ Standard-Bibliothek Datenstrukturen, z.B .:Werden C++ 11-Container von Cython unterstützt?

from libcpp.vector cimport vector 
    from libcpp.utility cimport pair 

Aber was neue Behälter mit C++ 11 eingeführt zu importieren: std::unordered_map, std::unordered_set usw. Sind sie auf die gleiche Art und Weise unterstützt? Ich konnte die entsprechende Importanweisung nicht finden.

Antwort

-2

Cython unterstützt sie standardmäßig nicht, aber Sie könnten wahrscheinlich Ihre eigene Schnittstelle erstellen, die der Struktur https://github.com/cython/cython/blob/master/Cython/Includes/libcpp/map.pxd folgt.

Cython wird jetzt unordered_map und unordered_set seit 0.20.2 unterstützt.

from libcpp.unordered_map cimport unordered_map 
from libcpp.unordered_set cimport unordered_set 
+1

Diese Antwort war wahrscheinlich zu der Zeit richtig, aber ist jetzt veraltet. –

14

Aktuelle Cython-Versionen erlauben sie.

Stellen Sie sicher, Ihre setup.py enthält so etwas wie:

ext_module = Extension(
    "foo", 
    ["foo.pyx"], 
    language="c++", 
    extra_compile_args=["-std=c++11"], 
    extra_link_args=["-std=c++11"] 
) 

Sie dann

from libcpp.unordered_map cimport unordered_map 

wie für jede andere STL-Klasse verwenden können.

+0

Das scheint nicht mit dem (jetzt aktuellen) Cython zu funktionieren: '/usr/local/lib/python2.7/dist-packages/Cython/Compiler/Main.py:554: UserWarning: habe bitte unbekannte Übersetzungsoptionen remove: extra_link_args, extra_compile_args' (und dann schlägt es mit dem C++ 11-bezogenen Fehler fehl). Mein setup.py sieht wie folgt aus: 'ext_modules = cythonize ('x.pyx', language = 'C++', )'. –

+0

@David Sie müssen die Extension() -Syntax verwenden, anstatt die Parameter direkt in cythonize() anzugeben. –