我需要一些帮助来理解stdext :: hash_multimap的lower_bound,upper_bound和equal_range是如何工作的(至少是它的VS2005版本)。
我有以下代码(问题摘要)
#include <hash_map>
using stdext::hash_multimap;
using std::greater;
using stdext::hash_compare;
using std::pair;
using std::cout;
typedef hash_multimap < double, CComBSTR, hash_compare< double, greater<double> > > HMM;
HMM hm1;
HMM :: const_iterator it1, it2;
pair<HMM::const_iterator, HMM::const_iterator> pairHMM;
typedef pair <double, CComBSTR> PairDblStr;
// inserting only two values for sample
hm1.insert ( PairDblStr ( 0.224015748, L"#1-64" ) );
hm1.insert ( PairDblStr ( 0.215354331, L"#1-72" ) );
// Using a double value in between the inserted key values to find one of the elements in the map
it1 = hm1.lower_bound( 0.2175 );
if( it1 == hm1.end() )
{
cout << "lower_bound failed\n";
}
it1 = hm1.upper_bound( 0.2175 );
if( it1 == hm1.end() )
{
cout << "upper_bound failed\n";
}
pairHMM = hm1.equal_range( 0.2175 );
if( ( pairHMM.first == hm1.end() ) && ( pairHMM.second == hm1.end() ) )
{
cout << "equal_range failed\n";
}
如评论中所述,我传递的值是在两个插入的键值(0.224015748,0.215354331)之间的值(0.2175)。但代码的输出是:
lower_bound failed
upper_bound failed
equal_range failed
我是否误解了如何在地图中使用lower_bound,upper_bound和equal_range?我们能否使用这些方法找到“最接近的匹配”键?如果这些方法不合适,您对我可以用于我的要求有什么建议吗?
提前感谢您的帮助。
感谢@ billy-oneal @dauphic的评论和编辑。我已经更新了上面的代码,使其可编辑和可运行(当然,一旦你包含正确的标题)。
答案 0 :(得分:3)
我们不能使用这些方法找到“最接近的匹配”键吗?
没有。 hash_multimap
使用哈希表实现。两个彼此非常接近的键(例如,0.2153和0.2175)可能会映射到哈希表中完全不同的箱。
散列表不会按排序顺序维护其元素,因此如果没有线性搜索,您无法找到与给定键最接近的匹配。
lower_bound
中的upper_bound
,equal_range
和hash_multimap
函数在Visual C ++标准库扩展中有一些奇怪的实现。
考虑the documentation for lower_bound
:
成员函数确定受控序列中的第一个元素
X
,该第一个元素作为键散列到同一个存储桶,并具有等效的键排序。如果不存在这样的元素,则返回hash_map::end
;否则它返回一个指定X
的迭代器。您可以使用它来定位当前在受控序列中与指定键匹配的元素序列的开头。
the documentation for upper_bound
:
成员函数确定受控序列中的最后一个元素
X
,该元素与密钥一起散列到同一个存储桶,并具有等效的密钥排序。如果不存在这样的元素,或者X
是受控序列中的最后一个元素,则返回hash_map::end
;否则它返回一个迭代器,指定X
之外的第一个元素。您可以使用它来定位当前在受控序列中与指定键匹配的元素序列的结尾。
基本上,这些函数允许您识别具有给定键的元素范围。他们的行为不与std::lower_bound
或std::map::lower_bound
的行为相同(他们的行为是您期望的行为)。
对于它的价值,C ++ 0x无序关联容器不提供lower_bound
,upper_bound
或equal_range
函数。
您对我的要求能用什么有什么建议吗?
是:如果您需要lower_bound
和upper_bound
的行为,请使用有序的关联容器,例如std::multimap
。