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

问题描述 投票:0回答:1

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

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

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

例如,

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

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

我如何创建实现这种相等性的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);

我想要同时使用std::unorderd_map<std::pair<int, bool>, int>和自定义lambda比较器的find_if算法。如果有一种更简单的方法,我将不知所措。

c++ lambda unordered-map
1个回答
0
投票

在那种情况下,为什么键的bool部分呢?

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

因此,在这种情况下,使用改为std::vector<std::map<int, std::pair<int, int>>

鉴于使用了地图,通过对地图内容进行排序比较容易,通过使用std::lexicographical_compare比较两个地图和适当的比较功能。

并且该比较功能将只比较每对的第一项(真实计数)。

如果一个映射螺母中不存在key,并且true计数不为0,则为不匹配。

地图1的内容将是:

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

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

  • truefalse数据放在单独的容器中更合适吗?
    • 对于向量中的每个项目?
    • 或使用不同的向量?
  • 数据是否主要仅用于匹配目的?
    • 如果是这样,使用settuple可能会使某些算法更易于编写。
    • 此外,还可以反转键中boolint的顺序,以便将搜索应用于可以通过搜索轻松找到的子范围(true部分) lower_bound{true, INT_MIN }
© www.soinside.com 2019 - 2024. All rights reserved.