1

是否可以使用仅需要的工具和模块中Iterators的功能指针?<algorithm>PyObjects

我要解决的具体问题(它是为了从中学习而构建的):

  • 我有一个巨大的 ID 列表存储在 python-list 中
  • 现在我想std::binary_search在这个列表上执行一个,使用一个用 C++ 编写的模块

一种方法是将 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;
    }
};

我还没有编译这个,可能忘记了一些部分,但我想你明白了。只需初始化两个迭代器,一个偏移量为零,一个偏移量为容器大小,并将它们提供给binary_search().

于 2013-05-04T13:55:55.723 回答