二分探索はそれほど複雑ではないので、反復子の代わりにインデックスの範囲に基づいて単純にコーディングしてみませんか? リストは 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()
です。