我在我的代码中使用了一个地图<BSTR,struct>
bstr是关键并构造了值。
这会起作用还是我必须重新定义一些东西?
我看不到编译问题,我也可以添加元素。但是,map.find()
不起作用。即使元素存在,它也总是返回map.end()
(未找到元素)。
我做了一个临时的解决方法,如下所示 - 从map.begin()
循环到map.end()
并为每个元素执行lstrcmpW。这似乎有效,但不要认为这太有效了。
关于可能出错的任何建议/提示?可以使用BSTR
作为地图的关键吗?我知道地图不支持某些非本机数据类型 - 结构或类......你需要为此定义一个<
运算符。
答案 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";
}