std :: string强制转换为const char *在std :: unordered_set <const char *>中找不到

玉米片3

在从事一个项目时,我遇到了一个我自己无法解释的问题。

我有以下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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将std :: string转换为const char *或char *?

将const char **转换为std :: vector <const char *>

std :: to_string存储在const char *中

std :: string和const char *

为什么将const char *强制转换为std :: string起作用?

C ++ const char *转换为std :: string&

将 const char 转换为 std::string 作为标题

从std :: unordered_set <char>有效构造std :: string

将const std :: vector <char>强制转换为未签名的char *?

在std :: __ cxx11 :: basic_string <char,std :: char_traits <char>,...,std :: allocator <char>> const&)中获取未知的分段错误“(地址)const()const()

为什么在片段中从char *到std :: string的转换比向const char *的转换更可取?

错误:无法将'std :: basic_string <char> :: iterator ...'转换为'const char * for parameter'1'...'

C ++错误:无法将'std :: basic_string <char>'转换为'const char *'

如何将 const char& 转换为 const std::string&?

如何将“ std :: vector <std :: string>”转换为“ const char * array”?

如何将std :: wstring转换为char const []

错误:请求从“const char”转换为非标量类型“std::string”{aka 'std::__cxx11::basic_string<char>'}

从“ std :: string”到“ const char *”的转换函数不存在

const std::unordered_map<char, int>' as 'this' 参数丢弃 lambda 中的限定符

std :: string.assign(const char *)或op =(带有const char *)会创建char *的副本吗?

_alloca 和 std::vector of const char*

如何将std :: string_view转换为const char *?

为什么const char *隐式转换为bool而不是std :: string?

字符串自动将const char *转换为std :: string

未定义引用`cv :: error(int,std :: string const&,char const *,char const *,int)'

std :: string转换为char *

错误无法将“coll”(类型“std::__cxx11::list<char>”)转换为“const char&”

从std :: map <std :: basic_string <char>,std :: pair <int,int(*)(const std :: vector :: Mat

创建 std::tuple 时从 const char* 或 char* 推导出 std::string