首页 > 解决方案 > 从另一个列表中删除一个列表中的内容

问题描述

我有两个列表,其中包含一堆相同类型的元素:

std::list<Part> allParts = step.getSubParts();
std::list<Part> toRemove;
for (Part part : allParts)
{
    for (Part partTwo : allParts) {
        if (part.getEdges() == partTwo.getEdges())
            if (part.getFaces() == partTwo.getFaces())
                if (part.getShells() == partTwo.getShells())
                    if (part.getVertices() == partTwo.getVertices())
                        if (part.getWires() == partTwo.getWires())
                        {
                            part.addAmount(1);
                            toRemove.push_back(partTwo);
                        }

    }
}

我曾尝试遍历两者并从中删除,但我不断收到list iterators are incompatible错误消息。这是我最近的尝试:

std::list<Part>::iterator it;
for (it = step.getSubParts().begin(); it != step.getSubParts().end();)
{
    std::list<Part>::iterator i;
    for (i = toRemove.begin(); i != toRemove.end();)
    {
        if (it->getEdges() == i->getEdges())
            if (it->getFaces() == i->getFaces())
                if (it->getShells() == i->getShells())
                    if (it->getVertices() == i->getVertices())
                        if (it->getWires() == i->getWires())
                        {
                            it = step.getSubParts().erase(it);
                        }
                        else
                        {
                            it++;
                        }
        i++;
    }
}

我尝试过的一切都不起作用。这样做的正确方法是什么?

标签: c++listiterator

解决方案


您应该考虑remove_if或者erase_if不要自己进行擦除,iterator以免在循环中导致无效。

顺便说一句,您应该编写如下谓词:

if (it->getEdges() == i->getEdges() &&
    it->getFaces() == i->getFaces() &&
    it->getShells() == i->getShells() &&
    it->getVertices() == i->getVertices() &&
    it->getWires() == i->getWires()) {
    // do something
}

您的代码使人们难以理解您的目的(至少是我)。

擦除和擦除_if


推荐阅读