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

问题描述 投票:4回答:2

所以可以说我有一个deque<int>。我也有一个int*指向双端队列中的特定元素x,但我不知道x的索引。有没有一种方法可以仅通过指向x的指针从双端队列中删除x

c++ pointers deque
2个回答
2
投票

有没有一种方法可以仅通过指向x的指针从双端队列中删除'x'?

是的,有一种方法。使用线性搜索来查找双端队列的元素,其地址与指针相同。这将为要删除的元素生成一个迭代器。将其传递给deque::erase。有一种用于线性搜索的标准算法:std::find_if

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

还请注意,擦除双端队列的元素会使所有引用(包括指向容器的指针和迭代器,除非您从两端之一擦除(在这种情况下,仅对被擦除元素的引用都无效)无效)。


0
投票

我加入之前的评论,

解决此问题可以使迭代器(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;
}

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

© www.soinside.com 2019 - 2024. All rights reserved.