从功能中删除Vector中的元素

时间:2011-11-03 08:22:44

标签: c++

在C ++中,除了我的问题Erasing element from Vector之外,我如何将从向量中删除元素的方法概括为一个带有以下参数的函数:向量和要从中删除的元素矢量?

bool removeElementFromVector(vector * collection, void * element) {
    for(int i=0; i<collection->size(); i++){
        if (collection[i]==element){
            swap(collection[i], collection.back());
            collection.pop_back();
            return true;
        }
    }
}

我的问题是,我不知道参数列表的外观如何,以便能够使用任何 vector<whatever*>和任何对象{{ 1}}!?

编辑:解决方案:

myfunctions.h

whatever

myclass.h

template <typename T>
bool removeElementFromVector(vector<T> & collection, T const & element) { 
    // for... 
}

myclass.cpp

#include "myfunctions.h"
public:
vector<Item*> items;                        
void removeItem(Item * item);          

3 个答案:

答案 0 :(得分:5)

您应该将该功能变为模板:

template <typename T>
bool removeElementFromVector(vector<T> & collection, T const & element);

另外,不要使用指针。

答案 1 :(得分:5)

在C ++中,编写适用于不同类型的通用代码的类型安全方法不是传递void*,而是传递模板。在您的特定情况下:

template <typename T>
void removeElement( std::vector<T> & collection, T const & element ) {
   collection.erase( std::remove( collection.begin(), collection.end(), element ),
                     collection.end() );
}

通过在包含的类型T上使用模板,可以使其成为通用的。在内部,从向量中删除元素的习惯用法是 erase-remove 成语,它将删除匹配的元素,并向前压缩其余元素,保持相对顺序。我已经改变了引用的指针。如果您的容器包含指向给定类型的指针,并且传递的元素是指向该类型的指针,则编译器会将T推断为type*,但上面的代码也适用于那些容器。不要持指针(更通用一点)

如果相对顺序不重要,您可以使用与问题相同的循环,这样会更有效(副本数量更少)。

答案 2 :(得分:1)

将该功能设为模板:

template <typename T>
bool removeElementFromVector(vector<T*> * collection, T* element) {
    for(int i=0; i<collection->size(); i++){
        if (collection[i]==element){
            swap(collection[i], collection.back());
            collection.pop_back();
            return true;
        }
    }
}

另一方面,你的代码对所有这些指针都相当可怕。标准容器用于存储完整对象,而不仅仅是指针。同样,element参数可以很容易地成为(const)引用。