在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);
答案 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)引用。