在迭代它时从向量中删除对象

时间:2016-06-10 00:44:46

标签: c++

我是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()函数,但我无法通过pitbit。任何帮助赞赏。感谢

2 个答案:

答案 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() };