我是C ++的新手,因此我无法确定如何在向量中移除对象时如何最好地将其移除。
基本上,我需要迭代两个向量。对于每件商品,如果ID匹配,我可以将其删除。
//For every person, check to see if the available bags match:
for(std::vector<Person>::iterator pit = waitingPeopleVector.begin(); pit != waitingPeopleVector.end(); ++pit) {
for(std::vector<Bag>::iterator bit = waitingBagsVector.begin(); bit != waitingBagsVector.end(); ++bit) {
int pId = pit->getId();
int bId = bit->getId();
if(pId == bId){
//a match occurs, remove the bag and person
}
}
}
使用迭代器有点令人困惑,我知道我可以在我的向量上使用.erase()
函数,但我无法通过pit
或bit
。任何帮助赞赏。感谢
答案 0 :(得分:1)
来自标准:
从a.erase(q)返回的迭代器指向该元素 在元素被擦除之前紧跟在q之后。如果没有这样的话 元素存在,返回a.end()。
我会在使用erase
方法时使用它:
std::vector<Person>::iterator pit = waitingPeopleVector.begin();
std::vector<Bag>::iterator bit = waitingBagsVector.begin();
while (pit != waitingPeopleVector.end())
{
bool didit;
while (bit != waitingBagsVector.end())
{
didit = false;
if (pit->getId() == bit->getId() && !didit)
{
bit = waitingBagsVector.erase(bit);
pit = waitingPeopleVector.erase(pit);
didit = true;
}
else
{
++bit;
}
}
if (didit)
continue;
else
++pit;
}
答案 1 :(得分:0)
使用erase-remove惯用法将实现此目标,下面提供了一种(未经测试的)方式,使用lambdas和<algorithm>
函数从wPL
中删除与wBL
具有相同ID的元素}。将此扩展到两个列表都不应该付出太多努力。请注意,我们使用std::list
代替std::vector
来更快地删除。
std::list<Person> wPL;
std::list<Bag> wBL;
//...
wPL.erase(std::remove_if(wPL.begin(), wPL.end(),
[&wBL](auto x) { return std::find_if(wBL.begin(), wBL.end(), [](auto y)
{ return x.getId() == y.getId();); }), wPL.end() };