如何使用指针从双端删除特定元素

How to remove a specific element from a deque with a pointer

本文关键字:删除 元素 何使用 指针      更新时间:2023-10-16

假设我有一个deque<int>。我还有一个int*指向双克中x的特定元素,但我不知道x的索引。有没有办法只用一个指向x的指针就可以从我的 deque 中删除x

有没有办法只用指向 x 的指针从我的 deque 中删除"x"?

是的,有办法。使用线性搜索查找地址与指针相同的 deque 元素。这应该会生成要删除的元素的迭代器。把它传递给deque::erase.线性搜索有一个标准算法:std::find_if.

但请注意,此搜索会产生一些开销。如果首先存储迭代器而不是指针,则可以避免搜索。也就是说,擦除本身具有线性复杂性(除非元素位于其中一端(,因此搜索不会使复杂性逐渐恶化。

另请注意,擦除 deque 的元素会使所有引用(包括指向容器的指针和迭代器(无效,除非您从其中一端擦除(在这种情况下,只有对已擦除元素的引用无效(。

我加入了之前的评论,

解决这个问题可以解决迭代器(Boosted Pointers(,也许线性算法可以实现你的期望。

#include <iostream>
#include <deque>
#include <algorithm>
#include <functional>
int main()
{
int *ptr(0);
ptr=new int;
std::deque<int> values={1,2,3,4,5};
ptr=&values[3]; /*Let's seach for the number 4*/
std::function<void(int&)> lambda = [&](int& it)mutable throw()->
void { (&it == ptr)? values.erase(values.begin()+(&it- 
&values[0])):values.begin();};
std::for_each(values.begin(), values.end(), lambda);
for(int& it :values){
std::cout<<it<<std::endl;
}
delete ptr;
*ptr=0;
return 0;
}

如果有任何错误,请告诉我,希望我正确回答了您的任务。