从 Cython 中的 std:vector 中删除一个元素
Removing an element from std:vector in Cython
从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++问题。请考虑重新标记。这将帮助您从相关人员那里获得对您的问题的关注。
相关文章:
- lower_bound()返回最后一个元素
- 使用std::transform将一个范围的元素添加到另一个范围中
- 我想访问std::unique_ptr中的一个特定元素
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- 删除映射和分割错误中的一个过去结束元素
- Lower_bound不适用于具有 3 个元素的向量的最后一个元素
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- 检查 2D 网格的某个元素是否与另一个元素共享对角线、水平线或垂直线
- 如何创建一个所有行大小不同的 2D 数组,并且用户将指定每行将有多少个元素?
- 仅显示链表的最后一个元素
- 为什么在 std::map 上移动无法将元素从一个映射移动到另一个映射
- 查找最小的下一个更大的元素
- push_back通过自行创建的对象获取最后一个元素的向量
- 使用 map.end() 访问 map 的最后一个元素
- 如何知道地图中的最后一个元素是否被删除?
- 选择一个元素而不是一个对象的数组的原因
- std::矢量保存 只推送最后一个元素
- 为什么这个选择排序算法仍然切换一个元素,当它已经是其他元素中最小的元素时?
- 动态分配列表 - 创建一个函数,用于删除所有包含偶数值的元素