我在我的代码中使用了一个映射 <BSTR,struct>
bstr作为键并构造值 .
这项工作还是我必须重新定义一些东西?
我看到没有编译问题,我也可以添加元素 . 但是, map.find()
不起作用 . 即使该元素存在,它也始终返回 map.end()
(未找到元素) .
我做了一个临时的解决方法如下 - 从 map.begin()
循环到 map.end()
并为每个元素执行lstrcmpW . 这似乎有效,但不要认为这太有效了 .
什么可能是错的任何建议/提示?可以使用 BSTR
作为 Map 的关键吗?我知道 Map 不支持某些非本机数据类型 - 结构或类......你需要为此定义一个 <
运算符 .
2 回答
使用ATL的CComBSTR作为密钥类型而不是BSTR . CComBSTR重载operator<来执行实际的字符串比较,而不是像你当前那样使用指针(地址)比较 .
CComBSTR还简化了生命周期管理 . 使用BSTR作为密钥类型,您必须确保BSTR比映射的生命周期更长(实际上它们必须在 Map 被破坏之前被释放) . CComBSTR遵循RAII原则,因此您无需进行任何手动释放 .
C中的BSTR类型是指针 . Map正在比较彼此之间的指针,而不是字符串 . 要在map中使用,你应该为BSTR编写一个包装器或使用预制的包装器 .