Visual C ++ hash_multimap找不到任何结果

时间:2010-08-09 23:06:35

标签: visual-c++ stl

我需要一些帮助来理解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的评论和编辑。我已经更新了上面的代码,使其可编辑和可运行(当然,一旦你包含正确的标题)。

1 个答案:

答案 0 :(得分:3)

  

我们不能使用这些方法找到“最接近的匹配”键吗?

没有。 hash_multimap使用哈希表实现。两个彼此非常接近的键(例如,0.2153和0.2175)可能会映射到哈希表中完全不同的箱。

散列表不会按排序顺序维护其元素,因此如果没有线性搜索,您无法找到与给定键最接近的匹配。

lower_bound中的upper_boundequal_rangehash_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_boundstd::map::lower_bound的行为相同(他们的行为是您期望的行为)。

对于它的价值,C ++ 0x无序关联容器不提供lower_boundupper_boundequal_range函数。

  

您对我的要求能用什么有什么建议吗?

是:如果您需要lower_boundupper_bound的行为,请使用有序的关联容器,例如std::multimap