具有自定义键的Multimap -比较功能
multimap with custom keys - comparison function
bool operator<(const Binding& b1, const Binding& b2)
{
if(b1.r != b2.r && b1.t1 != b2.t1)
{
if(b1.r != b2.r)
return b1.r < b2.r;
return b1.t1 < b2.t1;
}
return false;
}
我有一个类似上面的比较函数。基本上,如果它们的一个属性匹配,我需要认为对象相等。我使用这个比较函数为我的multimap,其关键是"绑定"对象。我面临的问题是lower_bound和upper_bound函数返回指向有效对象的相同迭代器。例如,(t1 = 1, r = 2)已经在映射中,当我尝试用(t1 = 1, r = 2)在映射中搜索它时,我得到的迭代器与upper_bound和lower_bound函数的返回值相同。
比较函数有什么问题吗?是否有一种方法来计算一个函数,我仍然可以确保对象是等效的,即使只有一个字段匹配?upper_bound迭代器不应该返回
映射或multimap的比较器应该表示键集之间的严格弱排序关系。您的要求"如果两个对象的字段中只有一个匹配,则两个对象是等价的"不可能是这样的关系。以这三个键为例:
1: r=1, t1=10
2: r=1, t1=42
3: r=2, t1=42
显然,键1和键2是等价的,因为它们有相同的r
。同样,2和3是等价的,因为它们有相同的t1
。这意味着,1和3也必须是等价的,尽管它们没有匹配的字段。
作为推论,在这种情况下,所有可能的键必须是等价的,这意味着你根本没有任何排序,而multimap不是正确的方法。
对于您的情况,Boost。我想到了MultiIndex。然后,您可以为r
和t1
设置两个单独的索引,并分别对这两个索引进行lower_bound
, upper_bound
和equal_range
搜索。
删除冗余代码后的比较函数可以重写为
bool operator<(const Binding& b1, const Binding& b2)
{
if(b1.r != b2.r && b1.t1 != b2.t1)
{
//if(b1.r != b2.r) // always true
return b1.r < b2.r;
//return b1.t1 < b2.t1; // Never reached
}
return false;
}
或者根据de-morgan定律
bool operator<(const Binding& b1, const Binding& b2)
{
if(b1.r == b2.r || b1.t1 == b2.t1) return false;
else return b1.r < b2.r;
}
如果a < b
和b < c
a < c
例:绑定(r, t):一个(3、5)、b(4、6),c (5,5)
如果您的比较函数不遵循上述标准,您可能会得到奇怪的结果。(如果库不健壮,在某些情况下包括无限循环)
如果r
s或t
s因为if()子句中的&&
而匹配,则比较函数将返回false。你是说||
吗?将&&
替换为||
将为您提供一个有效的比较函数,该函数首先比较r
字段,然后比较t
字段。
请注意,std::pair
已经有一个比较函数来做这个。
你的代码下面的文本虽然声明:
基本上,如果它们的一个属性匹配
,我需要认为对象相等
你不能这样做,因为它不是传递的(这样你就不会有严格的排序)。
在你的if
块内部有另一个if
,它肯定为真,因为&&
子句意味着两边都为真。
- 如何改进我的"String"对象比较功能
- 使用不遵循"严格弱排序"的比较功能对列表进行排序
- 如何在C++中使用自定义比较功能对字符串进行排序?
- 标准::地图比较功能
- C++ lower_bound比较功能问题
- 自定义stable_sort比较功能
- 带有额外参数的排序列表以进行比较功能
- 使用自定义比较功能设置相等性
- 相同的比较功能为C++中的排序和优先级队列提供不同的输出
- 使用自定义比较功能对静态多维数组进行排序
- 提升优先级队列比较功能
- 优先级队列中的运算符重载或比较功能C++
- C 比较功能结果
- STD :: SET的有效比较功能
- C++ STL 中排序的自定义比较功能
- 映射与对象键,查找和比较功能
- 具有多种比较功能的单标::地图/多地图
- 如何将unordered_set与比较功能一起使用
- 比较功能不适用于equal_range
- 如何对包含 pair<int,int> 元素的向量进行排序?排序是根据比较功能完成的