0

根据我的推断, std::map::find() 方法通过比较指针地址而不是值来搜索地图。例子:

std::string aa = "asd";
const char* a = aa.c_str();
const char* b = "asd";
// m_options is a std::map<const char*, int )
m_options.insert( std::make_pair( a, 0 ) );
if( m_options.find( b ) != m_options.end() ) {
    // won't reach this place
}

我有点惊讶(因为我使用的是原始类型而不是某些类)并且我认为我做错了什么,如果不是那么如何强制它使用值而不是地址?

4

2 回答 2

8

您正在char *用作地图的键类型。对于指针类型,比较是通过它们的地址来执行的(因为map无法知道这些指针是以 NULL 结尾的 8 位字符串)。

为了实现您的目标,您可以创建map带有自定义compare功能,例如:

bool MyStringCompare(const char *s1, const char *s2) { 
  return strcmp(s1, s2) < 0; 
}
...
std::map<const char*, int, MyStringCompare> m_options;

或者考虑使用std::string作为键类型。

于 2013-04-14T20:34:52.220 回答
4

实际上,map 使用严格排序的比较运算符来查找值,而不是相等运算符。无论如何,您可以通过传递一个比较字符串值的自定义函子来实现这一点,或者做正确的事情并std::string改用它。

于 2013-04-14T20:31:26.193 回答