Использовать C ++ — Итераторы в Python-List с Python / C API?

Можно ли использовать только инструменты Iterators и указатель на функцию из модуля <algorithm> на PyObjects ?

Конкретная проблема, которую я хочу решить (она создана для того, чтобы извлечь из нее уроки):

  • У меня есть огромный список идентификаторов, хранящихся в списке Python
  • Теперь я хочу выполнить std::binary_search в этом списке, используя модуль, написанный на C ++

Одним из способов может быть доступ к списку python как c-массиву, построение вектора из него (который использует указатели / не копирование), выполнение binary_search и экспорт массива как PyObject,

Это будет возможно?

1

Решение

Ну, бинарный поиск не так уж сложен, так почему бы вам просто не кодировать один, основанный на диапазоне индексов, а не итераторов? Я считаю, что список соответствует протокол последовательности Python, так что это должно быть довольно легко.

Если вы действительно хотите использовать binary_search() алгоритм обучения, есть также возможность создавать итераторы в стиле STL поверх последовательности Python. Все, что вам нужно, это указатель на последовательность и индекс для создания итератора с произвольным доступом. Если вы хотите, вы также можете прозрачно преобразовать объекты Python в списке в соответствующий тип идентификатора (я думаю, что это целочисленный тип).

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(),

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]