从 Cython 中的 std:vector 中删除一个元素

Removing an element from std:vector in Cython

本文关键字:元素 一个 删除 中的 Cython std vector      更新时间:2023-10-16

从Cython我正在使用C++的std:vector,我需要删除一个元素。对于我的确切用例,所有向量都是 int 型。我认为最干净的方法是使用 std:remove 和 vector 的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]

换句话说,元素不会从矢量中删除。我犯了什么简单的错误?

从 C++ 中的向量中删除元素非常容易。您的擦除/删除组合适用于更复杂的内容。

给定一个迭代器it,则

v.erase(it)

将删除它(请参阅相关的vector文档)。


顺便说一下,如果你需要找到这个迭代器,你可以使用find(从algorithm):

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

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

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

附言这根本不是一个真正的Cython问题。这是一个在Cython背景下提出的C++问题。请考虑重新标记。这将帮助您从相关人员那里获得对您的问题的关注。