好吧,二分搜索并不那么复杂,那么为什么不简单地根据一系列索引而不是迭代器来编写代码呢?我相信列表符合 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;
}
};
我还没有编译这个,可能忘记了一些部分,但我想你明白了。只需初始化两个迭代器,一个偏移量为零,一个偏移量为容器大小,并将它们提供给binary_search()
.