【问题标题】:How to remove a specific element from a deque with a pointer如何使用指针从双端队列中删除特定元素
【发布时间】:2020-09-03 19:35:40
【问题描述】:

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

【问题讨论】:

  • 不容易。您必须遍历元素才能找到具有匹配地址的元素。试着修改你的程序,让你拥有迭代器而不是指针。

标签: c++ pointers deque


【解决方案1】:

有没有一种方法可以只用指向 x 的指针从我的双端队列中删除“x”?

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

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

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

【讨论】:

    【解决方案2】:

    我加入了以前的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;
    }
    

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

    【讨论】:

      猜你喜欢
      • 2013-05-21
      • 2015-05-07
      • 1970-01-01
      • 2020-01-28
      • 2021-08-18
      • 1970-01-01
      • 2012-03-19
      • 2012-07-27
      • 2020-07-23
      相关资源
      最近更新 更多