如何制作地图<clsid,string =“”>?</clsid,>

时间:2009-04-30 01:47:09

标签: stl map

我想创建一个可以将CLSID结构与其他东西相关联的容器(例如,字符串);例如,std :: map。

(CLSID表示标准的Windows CLSID结构)

但是当我想使用它的find()和insert(object [clsid] = string)时,STL只是失败了并且给出了错误。

有谁知道如何解决这个问题?

例如:

typedef std::map<CLSID, std::string> MyCLSIDMap;
MyCLSIDMap mymap;
CLSID sample = CLSID_NULL;

mymap[sample] = string("test");   // compilation failed here

3 个答案:

答案 0 :(得分:5)

正如Alex回答的那样,std :: map需要将其键与op&lt;。

进行比较
bool operator<(CLSID const& l, CLSID const& r)
{
    return memcmp(&l, &r, sizeof(CLSID)) < 0;
}

答案 1 :(得分:2)

您的CLSID结构是否支持可用的运算符&lt;()?这对于s​​td :: map来说至关重要(你可以将它构建为一个单独的bool函子,它带有两个const CLSID&amp;参数,它不一定是CLSID中的方法运算符&lt;() - 但是你必须说std ::地图而不仅仅是地图......!)。

答案 2 :(得分:0)

要使用键是结构的STL映射,您需要提供自己的严格弱排序函数对象:

struct CompareCLSID
{
  bool operator()(const CLSID &s1, const CLSID &s2) const
  {
    // returns true if s1 is less than s2
  }
};

然后你的地图的类型就是map&lt; CLSID,string,CompareCLSID&gt ;.

但是,如果您不需要对容器进行排序(这是我的猜测),那么您应该使用hash&lt;&gt;或hash_map&lt;&gt;。在这种情况下,您必须提供自己的哈希函数。