如何创建在检查相等性时忽略某些键的自定义无序映射比较器?
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<std::pair<int, bool>, int>
和我的自定义 lambda 比较器。如果有更简单的方法,我会全力以赴。
【问题讨论】:
你提到“相等”,但是std::set
使用 operator <
或 strict-weak-order 对元素进行排序,而不是相等/不等式。
我只是想要一个容器来容纳这些,它也可以是一个向量。我将编辑我的问题。编辑:已更改。
【参考方案1】:
那么,为什么 bool 是键的一部分?
另一点是,如果您的无序地图非常大(例如数千个项目)或者项目比上面的示例代码复杂得多,那么您的搜索效率可能非常低。
所以在这种情况下,使用
std::vector<std::map<int, std::pair<int, int>>
代替。
鉴于使用了一张地图,使用std::lexicographical_compare
比较两张地图相对容易,而且地图内容排序后适当的比较功能。
并且该比较函数只会比较每对的第一项(真实计数)。
如果key
存在于一个地图螺母中而不存在于另一个地图螺母中,并且 true 计数不为 0,则它是不匹配的。
地图 1 的内容将是:
1, 0, 10
2, 15, 0
第一个数字等同于您的 key.first
第二个数字是 true 计数(当您的 key.second 为 true 时您的值)
第三个数字是 true 计数(当您的 key.second 为 false 时您的值)
还有许多其他选择,但需要知道如何使用数据才能知道什么是合适的。以下是一些想法:
将 true 和 false 数据放在单独的容器中是否更合适? 对于向量中的每个项目? 或者使用不同的向量? 数据是否主要仅用于匹配目的? 如果是这样,使用set
或 tuple
可能会使某些算法更易于编写。
此外,还可以颠倒键中bool
和int
的顺序,以便可以将搜索应用于子范围(true 部分),这很容易通过搜索 lower_bound
of true, INT_MIN
可以找到。
【讨论】:
以上是关于如何创建在检查相等性时忽略某些键的自定义无序映射比较器?的主要内容,如果未能解决你的问题,请参考以下文章
仅在 XML 中忽略字段,但在 Spring Boot(xml 映射器)中不忽略 json