C ++在向量迭代中删除并返回指向对象的指针

Posted

技术标签:

【中文标题】C ++在向量迭代中删除并返回指向对象的指针【英文标题】:C++ remove and return pointer to object in vector iteration 【发布时间】:2015-03-22 17:44:21 【问题描述】:

我有一个递归函数。我希望它返回一个指向向量元素的指针,但也希望从所述向量中删除该元素。大致如下:

std::vector<T> vec;
...
void my_get(T* t)

    if(blah())
    
        my_get(t);
     else
    
        for(std::vector<T>::iterator it=vec.begin(); it!=vec.end(); ++it)
        
            if(blah_blah(*it))
            
                // the essence of what I would like to achieve:
                t=it;
                erase(it);

                return;
            
        
    

我怎样才能做到这一点?大概一旦从向量中删除元素,指针将不再指向任何东西?我需要先将元素克隆到堆上的对象中吗?

【问题讨论】:

如果你解释你真正想做的事情,可能会有一个解决方案。 【参考方案1】:
T copy_of_t = *it;
erase(it);

我需要先将元素克隆到堆上的对象中吗?

你确实需要复制它是的。但是在 C++ 中,您通常不需要明确地考虑“堆”。如果你想处理T 类型的东西,那么只需处理T 类型的东西。不要被*T 分心。

更新:要在堆上显式创建副本,您可以这样做:

T* pointer_to_copy = new T(*it);

【讨论】:

谢谢。您如何建议我从函数中返回 copy_of_t?我选择外指针的原因是因为我认为简单地返回对象将涉及大量不必要的副本(因为函数是递归的)。但真的是这样吗? 我忘记了你的函数的递归方面。我已经更新了我的答案,以展示如何制作更安全的副本。但是您需要再次记住delete。或者,最好使用shared_ptrunique_ptr。最后,不要忘记,由于RVO,您的编译器可能能够优化副本,因此按值返回可能是最好的【参考方案2】:

我希望它返回一个指向向量元素的指针,但也希望从所述向量中删除该元素。

不是个好主意。从向量中删除元素后,不能保证指针有效。如果您访问这样的指针,您将拥有一个表现出未定义行为的程序。

别这样。

【讨论】:

是的,我闻起来不太对劲。关于如何从向量返回对象并将其删除的任何建议? @lemon,您已经拥有*t 中对象的副本。我不确定你为什么需要从vector 获取对象来制作副本。您可以轻松地从*t 复制。

以上是关于C ++在向量迭代中删除并返回指向对象的指针的主要内容,如果未能解决你的问题,请参考以下文章

我是不是正确删除了指向对象的指针向量?

在c ++中返回指向向量元素的指针

怎么删除STL容器的元素

从向量中删除项目

C ++从向量中删除指针会导致堆错误

如何从指向对象的指针向量中删除对象? [复制]