c++ - 如何过滤 std::list 并删除与另一个列表相比不匹配的项目?

标签 c++

我正在尝试删除与另一个列表中的元素不匹配的元素。

例如我有 std::list<MyClass> mainList其中包含这样的内容:

ID      Number
-------------
1       100
2       200
3       200
4       100
5       300

我还有一个std::list<long> itemsForFiltering其中包含:100, 300 .

在这里,我尝试删除 mainList 中的所有元素不在 itemsForFiltering 中.

int filterList(std::list<MyClass> &mainList, std::list<long> &itemsForFiltering)
{
    mainList.remove_if([](MyClass &val)
    {
        return val.Number != itemsForFiltering;
    });

    return 0;
}

这部分可能还需要一个 lambda 函数 return val.Number != itemsForFiltering;但我不知道怎么做。因此,我们非常感谢任何帮助。

调用此函数后,我应该在 mainList 中得到它:

ID      Number
-------------
1       100
4       100
5       300

最佳答案

为了提高效率,您可以首先创建一组无序的项目来过滤:

#include <unordered_set>

using namespace std;
...

auto itemsForFilteringSet = unordered_set<long>{itemsForFiltering};

现在您可以使用过滤

mainList.remove_if([&](MyClass &val)
{
    return itemsForFilteringSet.find(val) == itemsForFilteringSet.end();
});

这将使复杂性与列表长度之和成线性关系,而不是它们的乘积。

关于c++ - 如何过滤 std::list 并删除与另一个列表相比不匹配的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65490292/

相关文章:

C++类与函数,构造函数中的引用参数

c++ - C++从文件中读取格式化数据

c++ - 更改 C++ netbeans 项目中的主文件

c++ - 任何查看 C/CPP 应用程序内存数据结构的方法?

c++ - 为什么这个 += 循环比等价的 = 循环更快?

c++ - 如何使用 C++ 读取文本文件的各行

c++ - 从 QTreeWidget 覆盖复制文本操作

c++ - 浮点比较精度

c++ - 如何引导 OGDF 中的边?

c++ - penter 和 pexit 的 Visual Studio 宏