在 Cython 中从 std:vector 中删除一个元素
Removing an element from std:vector in Cython
我使用 C++ 的 Cython 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++ 中从向量中删除元素非常容易。您的 erase/remove 组合是 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 问题。这是一个在 Cython 上下文中出现的 C++ 问题。请考虑重新标记。这将帮助您引起相关人员对您的问题的关注。
我使用 C++ 的 Cython 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++ 中从向量中删除元素非常容易。您的 erase/remove 组合是 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 问题。这是一个在 Cython 上下文中出现的 C++ 问题。请考虑重新标记。这将帮助您引起相关人员对您的问题的关注。