Из Cython Я использую C++ std:vector
, и мне нужно удалить элемент. Для моего точного варианта использования все векторы имеют тип int
. Я думал, что самый чистый способ сделать это - использовать std:remove
и векторный метод erase
. По какой-то причине, следующий код не удаляя элементы, как и ожидалось:Удаление элемента из std: vector в Cython
# distutils: language=c++
from libcpp.vector cimport vector
cdef extern from "<algorithm>" namespace "std":
iter std_remove "std::remove" [iter, T](iter first, iter last, const T& val)
cdef void remove(vector[int] vect, int elem):
vect.erase(std_remove[vector[int].iterator, int](vect.begin(), vect.end(), elem))
def blah():
cdef vector[int] vect
cdef int i
for i in range(10):
vect.push_back(i)
for i in range(10):
print vect[i]
remove(vect, i)
return vect
Когда я бегу print blah()
я вижу:
0
1
...
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Другими словами, элементы не удаляются из вектора. Какую простую ошибку я делаю?
Для начала написано 'std :: remove'. Во-вторых, ваша декларация 'remove' отличается между вашим первым и вторым блоками кода - какое определение вы фактически используете? – nneonneo
Извините @nneonneo, я обновил свой код. Я нашел проблемы с объявлением ('::' является одним из них), но теперь удаление, похоже, не работает должным образом. Теперь этот вопрос отражает этот вопрос. –
Чтобы ответить на ваш другой вопрос @nneonneo, я определил 'std_remove', который вызывается моей функцией' remove', которая предположительно фактически стирает элемент из вектора. –