1

必要なツールとIteratorsモジュールからの関数ポインタ<algorithm>のみを使用することは可能PyObjectsですか?

解決したい具体的な問題(そこから学ぶように構築されています):

  • python-list に保存されている ID の膨大なリストがあります
  • std::binary_searchここで、C++ で記述されたモジュールを使用して、このリスト に対して a を実行したいと思います

1 つの方法は、python-list に c-array としてアクセスし、そこからベクトルを作成し (ポインターを使用する/コピーしない)、binary_search を実行し、配列を としてエクスポートすることPyObjectです。

それは可能でしょうか?

4

1 に答える 1

1

二分探索はそれほど複雑ではないので、反復子の代わりにインデックスの範囲に基づいて単純にコーディングしてみませんか? リストは Python のシーケンス プロトコルに準拠していると思いますので、それはかなり簡単なはずです。

学習体験のためにアルゴリズムを本当に使用したい場合binary_search()は、Python シーケンスの上に STL スタイルの反復子を作成することもできます。必要なのは、シーケンスへのポインターと、ランダム アクセス反復子を作成するためのインデックスだけです。必要に応じて、リスト内の Python オブジェクトを透過的に ID 型 (整数型だと思います) に変換することもできます。

struct iterator
{
    // typedefs required for fully compliant STL-style iterators
    typedef PyObject* value_type;

    iterator(PyObject* seqeunce, Py_ssize_t position):
        m_sequence(sequence), m_position(position)
    {
        assert(PySequence_Check(m_sequence));
        assert(m_position >= 0);
        assert(m_position <= PySequence_GetSize(m_sequence));
    }
    value_type operator*() const
    {
        assert(m_position < PySequence_GetSize(m_sequence));
        return PySequence_GetItem(m_sequence, m_position);
    }
    iterator& operator++()
    {
        assert(m_position <= PySequence_GetSize(m_sequence));
        ++m_position;
        return *this;
    }
    iterator& operator+=(size_t l)
    {
        m_position += l;
        return *this;
    }
};

私はこれをコンパイルしておらず、おそらくいくつかの部分を忘れていましたが、あなたはその考えを理解していると思います. オフセットがゼロのイテレータとコンテナのサイズのオフセットを持つイテレータの 2 つのイテレータを初期化し、それらを に渡すだけbinary_search()です。

于 2013-05-04T13:55:55.723 に答える