Visual c++ visualc&x2B+;哈希_多重映射找不到任何结果
我需要一些帮助来理解stdext::hash_multimap的下限、上限和相等范围是如何工作的(至少是它的VS2005版本) 我有以下代码(问题摘要) 我是否误解了如何在地图中使用下限、上限和相等范围?我们能不能用这些方法找到“最接近的匹配”键?如果这些方法不合适,你对我的要求有什么建议吗 提前感谢您的帮助 感谢@billy oneal@dauphic的评论和编辑。我已经更新了上面的代码,使其可编译和可运行(当然,一旦包含了正确的头) 我们能不能用这些方法找到“最接近的匹配”键 否。Visual c++ visualc&x2B+;哈希_多重映射找不到任何结果,visual-c++,stl,Visual C++,Stl,我需要一些帮助来理解stdext::hash_multimap的下限、上限和相等范围是如何工作的(至少是它的VS2005版本) 我有以下代码(问题摘要) 我是否误解了如何在地图中使用下限、上限和相等范围?我们能不能用这些方法找到“最接近的匹配”键?如果这些方法不合适,你对我的要求有什么建议吗 提前感谢您的帮助 感谢@billy oneal@dauphic的评论和编辑。我已经更新了上面的代码,使其可编译和可运行(当然,一旦包含了正确的头) 我们能不能用这些方法找到“最接近的匹配”键 否。hash\
hash\u multimap
是使用哈希表实现的。两个彼此非常接近的键(例如0.2153和0.2175)很可能映射到哈希表中完全不同的存储箱
哈希表不会按排序顺序维护其元素,因此如果不进行线性搜索,就无法找到与给定键最接近的匹配项
<>代码> >代码> uPull绑定,和<>代码>均衡器范围> /COD>函数在VisualC++标准库扩展中有点奇怪的实现。p>
考虑:
成员函数确定受控序列中的第一个元素X
,该元素散列到与key相同的bucket,并具有与key等效的顺序。如果不存在这样的元素,则返回hash_map::end
;否则,它将返回一个迭代器,指定X
。您可以使用它来定位当前受控序列中与指定键匹配的元素序列的开头
以及:
成员函数确定受控序列中的最后一个元素X
,该元素散列到与key相同的bucket,并具有与key相同的顺序。如果不存在这样的元素,或者X
是受控序列中的最后一个元素,则返回hash_map::end
;否则,它将返回一个迭代器,指定X
之外的第一个元素。您可以使用它来定位当前受控序列中与指定键匹配的元素序列的结尾
本质上,这些函数允许您识别具有给定键的元素范围。他们的行为与std::lower_bound
或std::map::lower_bound
的行为不同(他们的行为是您期望的)
值得一提的是,C++0x无序关联容器不提供下限
、上限
或相等范围
函数
你对我的要求有什么建议吗
是:如果您需要
下限
和上限
的行为,请使用有序的关联容器,如std::multimap
,您发布的代码将无法编译,您能否修复它,以便我们可以再次检查您是否正确使用它?例如if(it1=hm1.end())
和it1=hm1.upper_界限(0.2175)之后的行代码>将标签更改为VisualC++,因为标准C++没有HASHMultIMAP类型。multimap@dauphic. 谢谢你的建议。更新的代码已发布。@james mcnellis感谢您的回答。您关于使用std::multimap而不是stdext::hash\u multimap的建议奏效了。我之所以认为这三种方法能够实现我的想法,是因为以下MSDN页面:,它们与您发布的页面不同-您发布的页面似乎是针对CLR的(即托管代码,而不是本机代码)。我发布的文档与本地MSDN安装中的文档相同。Microsoft似乎存在文档缺陷。但是你的解释足以解决我的问题。@ossandcad:哦,很抱歉。我引用了hash\u映射
文档,而不是hash\u多重映射
文档。是的,hash\u multimap
文档充其量只是误导。它说它返回一个迭代器“如果找不到与键匹配的项,则该迭代器将处理hash_multimap中最后一个元素后面的位置”。因此,如果找不到与键匹配的项,它将返回end()
。不过,这句话的第一部分(我在这里没有引用)相当混乱。
#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";
}
lower_bound failed
upper_bound failed
equal_range failed