Можно ли использовать только инструменты Iterators
и указатель на функцию из модуля <algorithm>
на PyObjects
?
Конкретная проблема, которую я хочу решить (она создана для того, чтобы извлечь из нее уроки):
std::binary_search
в этом списке, используя модуль, написанный на C ++ Одним из способов может быть доступ к списку python как c-массиву, построение вектора из него (который использует указатели / не копирование), выполнение binary_search и экспорт массива как PyObject
,
Это будет возможно?
Ну, бинарный поиск не так уж сложен, так почему бы вам просто не кодировать один, основанный на диапазоне индексов, а не итераторов? Я считаю, что список соответствует протокол последовательности 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()
,
Других решений пока нет …