C ++ stl map:与BSTR有关的问题

时间:2012-11-29 16:41:42

标签: c++ winapi stl bstr

我在我的代码中使用了一个地图<BSTR,struct> bstr是关键并构造了值。

这会起作用还是我必须重新定义一些东西?

我看不到编译问题,我也可以添加元素。但是,map.find()不起作用。即使元素存在,它也总是返回map.end()(未找到元素)。

我做了一个临时的解决方法,如下所示 - 从map.begin()循环到map.end()并为每个元素执行lstrcmpW。这似乎有效,但不要认为这太有效了。

关于可能出错的任何建议/提示?可以使用BSTR作为地图的关键吗?我知道地图不支持某些非本机数据类型 - 结构或类......你需要为此定义一个<运算符。

3 个答案:

答案 0 :(得分:4)

使用ATL的CComBSTR作为密钥类型而不是BSTR。 CComBSTR重载operator<来执行实际的字符串比较,而不是像你当前那样使用指针(地址)比较。

CComBSTR还简化了生命周期管理。使用BSTR作为密钥类型,您必须确保BSTR比地图的生命周期更长(实际上它们必须在地图被破坏之前被解除分配)。 CComBSTR遵循RAII原则,因此您无需进行任何手动释放。

答案 1 :(得分:3)

C ++中的BSTR类型是一个指针。 Map比较彼此的指针而不是字符串。要在map中使用,你应该为BSTR写一个包装器或者使用预制的包装器。

答案 2 :(得分:0)

您可以将std :: find_if与unary_function结合使用,而不是从map.begin()循环到map.end()并对每个元素执行lstrcmpW,如下所示:

class IsBSTREqual : public unary_function<std::pair<BSTR,int>,bool>
{
private:
    BSTR str;
public:
     IsBSTREqual(BSTR _str)
     {
         str = ::SysAllocString(_str);
     }
     ~IsBSTREqual()
     {
           if(str)
           {
               ::SysFreeString(str);
           }
      }

      bool operator()(const std::pair<BSTR,int> &v)
     {
         if(!lstrcmpW(v.first,str))
         {
             return true;
         }
         return false;
      }
};

BSTR abc = ::SysAllocString(L"String I want to find");
IsBSTREqual _pred(abc);
std::map<BSTR,int>::iterator _it = 
std::find_if(attr_map.begin(),attr_map.end(),_pred);

if(_it != attr_map.end() )
    {
        cout<<"\nFound";
    }
    else
    {
        cout<<"\nNot found";
    }