在从事一个项目时,我遇到了一个我自己无法解释的问题。
我有以下is_in_set(..)函数,该函数只是检查cstring是否在cstring的unordered_set中:
bool is_in_set(const char * str, std::unordered_set<const char *> the_set)
{
if ( the_set.find( str ) != the_set.end() )
return true;
else
return false;
}
然后,我创建了以下示例主方法来演示我的问题:
int main()
{
std::unordered_set<const char *> the_set({"one",
"two", "three", "four", "five"});
std::string str = "three";
const char * cstr = "three";
std::cout << "str in set? "
<< is_in_set( str.c_str() , the_set ) << std::endl
<< "cstr in set? "
<< is_in_set( cstr, the_set ) << std::endl;
const char * str_conv = str.c_str();
std::cout << "str_conv in set? "
<< is_in_set( str_conv , the_set ) << std::endl
<< "strcmp(str_conv, cstr) = " << strcmp( str_conv , cstr )
<< std::endl;
return 0;
}
我希望上面的代码能找到转换为const char *的std :: string以及集合中的cstring。取而代之的是,它生成以下输出(Visual Studio Community 2017):
str in set? 0
cstr in set? 1
str_conv in set? 0
strcmp(str_conv, cstr) = 0
我还在两个变量上运行了一个for循环,为每个变量逐字节输出(以十六进制表示),结果如下:
74 68 72 65 65 00 = c_str
74 68 72 65 65 00 = str_conv
为什么在集合中找不到将std :: string强制转换为const char *?在这种情况下,strcmp是否应该返回一个不同于0的值?
对于const char *
,没有==
按值比较字符串的运算符的重载,因此我相信unordered_set
容器将始终比较指针,而不是指向的字符串的值。
作为一种优化,编译器可以使具有相同字符的多个字符串文字使用相同的内存位置(因此具有相同的指针),这就是为什么当您使用另一个字符串文字时可以找到该字符串的原因。但是,通过其他某种机制构造的任何字符串,即使包含相同的字符,也不会位于相同的内存位置,因此指针将不相等。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句