如何创建在检​​查相等性时忽略某些键的自定义无序映射比较器?

Posted

技术标签:

【中文标题】如何创建在检​​查相等性时忽略某些键的自定义无序映射比较器?【英文标题】:How Can I Create a Custom Unordered Map Comparor That Ignores Certain Keys When Checking Equality? 【发布时间】:2020-04-26 17:28:15 【问题描述】:

我想创建一个自定义比较函数发送到find_if 或另一个比较函数,为了进行相等比较,需要我忽略某些键。

我有一个包含无序地图的集合。我们称之为 vecMap。 vecMap 看起来像std::vector<std::unordered_map<std::pair<int, bool>, int>>

在我的场景中,当且仅当第二个值不是 true 的键相等时,我希望两个 std::unordered_map<std::pair<int, bool>, int> 相等。例如,

例如,

MapOne 内容:

Keys | Values
1, false | 10
2, true  | 15

MapTwo 内容:

Keys | Values
1, false | 10

这两个映射被认为是相等的,因为我们只关心 key.second 为 false 的键的相等性。

另一个例子,

MapOne 内容:

Keys | Values
1, false | 200
2, true  | 15

MapTwo 内容:

Keys | Values
1, false | 10

这两个映射被认为相等,因为唯一相等的键的数量是不同的。

如何创建实现这种相等类型的 lambda 表达式?

我的最终目标是拥有一个std::vector<std::unordered_map<std::pair<int, bool>, int>>,其中包含具有正确键的无序映射,并找到与另一个永远不会具有正确键的映射相等的对应映射。

例如,

using mapVec = std::vector<std::unordered_map<std::pair<int, bool>, int>>;

mapVec s;

// Fill s with unordered maps
// g = std::unordered_map<std::pair<int, bool>, int>
// customEquality = [](); (some lambda)?

mapVec::iterator it = s.find(g, customEquality);

我想要一个 find_if 算法,它同时使用我的 std::unorderd_map&lt;std::pair&lt;int, bool&gt;, int&gt; 和我的自定义 lambda 比较器。如果有更简单的方法,我会全力以赴。

【问题讨论】:

你提到“相等”,但是 std::set 使用 operator &lt; 或 strict-weak-order 对元素进行排序,而不是相等/不等式。 我只是想要一个容器来容纳这些,它也可以是一个向量。我将编辑我的问题。编辑:已更改。 【参考方案1】:

那么,为什么 bool 是键的一部分?

另一点是,如果您的无序地图非常大(例如数千个项目)或者项目比上面的示例代码复杂得多,那么您的搜索效率可能非常低。

所以在这种情况下,使用 std::vector&lt;std::map&lt;int, std::pair&lt;int, int&gt;&gt; 代替。

鉴于使用了一张地图,使用std::lexicographical_compare比较两张地图相对容易,而且地图内容排序后适当的比较功能。

并且该比较函数只会比较每对的第一项(真实计数)。

如果key 存在于一个地图螺母中而不存在于另一个地图螺母中,并且 true 计数不为 0,则它是不匹配的。

地图 1 的内容将是:

1, 0, 10
2, 15, 0
第一个数字等同于您的 key.first 第二个数字是 true 计数(当您的 key.second 为 true 时您的值) 第三个数字是 true 计数(当您的 key.second 为 false 时您的值)

还有许多其他选择,但需要知道如何使用数据才能知道什么是合适的。以下是一些想法:

truefalse 数据放在单独的容器中是否更合适? 对于向量中的每个项目? 或者使用不同的向量? 数据是否主要仅用于匹配目的? 如果是这样,使用 settuple 可能会使某些算法更易于编写。 此外,还可以颠倒键中boolint 的顺序,以便可以将搜索应用于子范围(true 部分),这很容易通过搜索 lower_bound of true, INT_MIN 可以找到。

【讨论】:

以上是关于如何创建在检​​查相等性时忽略某些键的自定义无序映射比较器?的主要内容,如果未能解决你的问题,请参考以下文章

Javascript中比较两个无序对象数组的自定义实现

仅在 XML 中忽略字段,但在 Spring Boot(xml 映射器)中不忽略 json

使用“=”测试相等性时“if”语句的意外行为[关闭]

Spring 4 中 Websockets 的自定义对象映射器

Summernote - 有序和无序列表的自定义下拉列表

ListView 的自定义适配器忽略设置值