在Cython中从std:vector中删除元素

时间:2015-06-19 17:12:35

标签: python c++ vector cython

来自Cython我使用C ++' std:vector我需要删除一个元素。对于我的确切用例,所有向量都是int类型。我认为最简洁的方法是使用std:remove和向量erase方法。由于某种原因,以下代码未按预期删除元素:

# 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]

换句话说,元素没有从向量中移除。我犯了什么简单的错误?

1 个答案:

答案 0 :(得分:3)

在C ++中从向量中删除元素非常简单。您的删除/删除组合为for more complicated stuff

给定迭代器it,然后

v.erase(it)

将删除它(请参阅pertinent vector doc)。

顺便提一下,如果您需要找到此迭代器,可以使用find(来自algorithm):

std::find(v.begin(), v.end(), value);

因此,要删除第一次出现的value,您可以使用

v.erase(std::find(v.begin(), v.end(), value));

P.S。这根本不是一个Cython问题。它是一个C ++问题,出现在Cython的背景下。请考虑重新标记。这将有助于您从相关人员那里获得关注。