【发布时间】:2020-09-03 19:35:40
【问题描述】:
假设我有一个deque<int>。我还有一个int* 指向双端队列中的特定元素x,但我不知道x 的索引。有没有办法只用指向x 的指针从我的双端队列中删除x?
【问题讨论】:
-
不容易。您必须遍历元素才能找到具有匹配地址的元素。试着修改你的程序,让你拥有迭代器而不是指针。
假设我有一个deque<int>。我还有一个int* 指向双端队列中的特定元素x,但我不知道x 的索引。有没有办法只用指向x 的指针从我的双端队列中删除x?
【问题讨论】:
有没有一种方法可以只用指向 x 的指针从我的双端队列中删除“x”?
是的,有办法。使用线性搜索查找地址与指针相同的双端队列的元素。这应该为您要删除的元素生成一个迭代器。将其传递给deque::erase。线性搜索有一个标准算法:std::find_if。
但请注意,此搜索会产生一些开销。如果您首先存储迭代器而不是指针,则可以避免搜索。也就是说,擦除本身具有线性复杂性(除非元素位于端点之一),因此搜索不会使复杂性渐近恶化。
还要注意,擦除双端队列的元素会使所有引用无效,包括指向容器的指针和迭代器,除非您从一端擦除(在这种情况下,只有对被擦除元素的引用无效)。
【讨论】:
我加入了以前的cmets,
解决这个问题可以请求迭代器(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;
}
如果有任何错误,请告诉我,希望我已经正确回答了您的任务。
【讨论】: