c++ - 从另一个列表中删除一个列表中的内容
问题描述
我有两个列表,其中包含一堆相同类型的元素:
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++;
}
}
我尝试过的一切都不起作用。这样做的正确方法是什么?
解决方案
您应该考虑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
}
您的代码使人们难以理解您的目的(至少是我)。
推荐阅读
- python - 具有重复组名的正则表达式
- liquibase - Liquibase 数据库更改日志表
- reactjs - 使用 npx create-react-app 创建反应应用失败
- javascript - 如何使用 API 返回的多个字段构建表列?
- javascript - 在 laravel 中访问 javascript 变量
- python - Google Cloud Run for Anthos(Knative)未在 https 请求上正确设置 X-Forwarded-Proto 标头
- javascript - Next.JS“比上一次渲染时渲染了更多的钩子”
- jmeter - 在分布式设置中安装 JMeter 插件
- python - 使用 minimax 优化国际象棋引擎
- neo4j - 具有索引约束的节点上的 Neo4j 合并查询需要 4-6 秒