我想使用erase方法从向量中清除元素.但是这里的问题是元素不能保证在向量中只出现一次.它可能存在多次,我需要清除所有这些.我的代码是这样的:
void erase(std::vector<int>& myNumbers_in, int number_in)
{
std::vector<int>::iterator iter = myNumbers_in.begin();
std::vector<int>::iterator endIter = myNumbers_in.end();
for(; iter != endIter; ++iter)
{
if(*iter == number_in)
{
myNumbers_in.erase(iter);
}
}
}
int main(int argc, char* argv[])
{
std::vector<int> myNmbers;
for(int i = 0; i < 2; ++i)
{
myNmbers.push_back(i);
myNmbers.push_back(i);
}
erase(myNmbers, 1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这段代码显然崩溃了,因为我在迭代它时改变了向量的末尾.实现这一目标的最佳方法是什么?也就是说有没有办法做到这一点,而无需多次迭代矢量或创建一个矢量的副本?
在C++中,除了我的问题从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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题在于我不知道参数列表是如何看起来的,以便能够与任何 vector<whatever*>和任何对象一起使用whatever!
编辑:解决方案:
myfunctions.h
template <typename T>
bool removeElementFromVector(vector<T> & collection, T const & element) {
// for...
}
Run Code Online (Sandbox Code Playgroud)
myclass.h
#include "myfunctions.h"
public:
vector<Item*> items;
void removeItem(Item * item);
Run Code Online (Sandbox Code Playgroud)
myclass.cpp
#include "myclass.h"
void myclass::removeItem(Item * item) {
removeElementFromVector(this->items, item);
}
Run Code Online (Sandbox Code Playgroud)