我想创建一个自定义比较函数以发送到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算法。如果有一种更简单的方法,我将不知所措。
在那种情况下,为什么键的bool部分呢?
另一点是,如果您的无序地图很大(例如成千上万个项目),或者该项目比上面的示例代码复杂得多,则搜索效率可能非常低。
因此,在这种情况下,使用改为std::vector<std::map<int, std::pair<int, int>>
。
鉴于使用了地图,通过对地图内容进行排序比较容易,通过使用std::lexicographical_compare
比较两个地图和适当的比较功能。
并且该比较功能将只比较每对的第一项(真实计数)。
如果一个映射螺母中不存在key
,并且true计数不为0,则为不匹配。
地图1的内容将是:
1, 0, 10
2, 15, 0
还有许多其他选择,但是需要知道如何使用数据来知道什么是合适的。这里有一些想法:
set
的tuple
可能会使某些算法更易于编写。bool
和int
的顺序,以便将搜索应用于可以通过搜索轻松找到的子范围(true部分) lower_bound
的{true, INT_MIN }
。