我想知道两个代码之间的区别是什么。当我使用.c_str()时它不起作用
std::vector<std::pair<std::string, std::string> >::iterator it
for(;it!=MySet.end();++it)
{
if(std::get<1>(*it).c_str()=="PAUSE") //Why it works only with std::get<1>(*it) and not with std::get<1>(*it).c_str()
{
TempDefaultVan = std::get<0>(*it).c_str();
}
}
答案 0 :(得分:4)
所以基本上发生的事情.c_str()
正在返回const char*
。这将导致operator ==
比较指针而不是字符串的内容。由于这两个显然都没有指向相同的内存位置(因为"PAUSE"
是一个字符串文字),所以这总是错误的。
答案 1 :(得分:3)
std::get<1>(*it)
返回std :: string类型的对象。此类具有重载operator ==
,用于将std :: string类型的对象与字符数组进行比较。
std::get<1>(*it).c_str()
返回一个字符数组。数组没有比较运算符。要比较字符数组,您应该使用标准C函数std::strcmp
所以你可以写
if( std::strcmp( std::get<1>(*it).c_str(), "PAUSE" ) == 0 )
如果您只是简单地写作
if(std::get<1>(*it).c_str()=="PAUSE")
然后编译器将比较两个指针,因为它将数组转换为指向这些表达式中的第一个元素的指针。因此,如果数组占用不同的内存区域,则此表达式将始终等于false。
答案 2 :(得分:1)
此代码:
std::get<1>(*it).c_str()=="PAUSE"
正在比较两个const char *
,它们都指向字符串。这不是您在比较字符串时通常想要的,因为当它们指向内存中的相同位置时,它只会评估为真。
此代码:
std::get<1>(*it)=="PAUSE"
将使用std::string::operator==
将std::string
std::get<1>(*it)
的内容与"PAUSE"
的内容进行比较。如果您有两个char *
值,则可以使用strcmp
,但由于您拥有std::string
,这是进行比较的最佳方式(并且,正如您所说,“它工作“)。