【问题标题】:C++ stl map: issues with BSTRC++ stl map:BSTR 的问题
【发布时间】:2012-11-29 16:41:41
【问题描述】:

我在我的代码中使用了一个映射 <BSTR,struct> bstr 作为键并构造了值。

这行得通还是我必须重新定义一些东西?

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

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

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

【问题讨论】:

标签: c++ winapi stl bstr


【解决方案1】:

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

CComBSTR 还简化了生命周期管理。使用 BSTR 作为键类型,您必须确保 BSTR 的寿命超过映射的生命周期(实际上它们必须在映射被破坏之前被释放)。 CComBSTR 遵循 RAII 原则,因此您无需进行任何手动释放。

【讨论】:

  • CComBSTR 确实会超载 operator== 但这没关系。 map 需要 operator&lt;,而不是 operator==。 CComBSTR 也重载了operator&lt;,这就是它以与std::map 兼容的方式具有可比性的原因。我会编辑你的答案。
  • @JohnDibling -- 注意CComBSTR 也重载了operator &amp;,所以容器的类型必须是std::map&lt;CAdapt&lt;CComBSTR&gt;, OPstruct&gt;。
【解决方案2】:

C++ 中的 BSTR 类型是一个指针。 Map 是比较指针而不是字符串。要在地图中使用,您可能应该为 BSTR 编写包装器或使用预制包装器。

【讨论】:

  • bstr_t_ 浮现在脑海中,但是我已经很久没有使用这个东西了,我几乎忘记了我曾经知道的一切。
【解决方案3】:

您可以将 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";
    }

【讨论】:

    猜你喜欢
    • 2011-06-01
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 2010-09-07
    • 1970-01-01
    相关资源
    最近更新 更多