C++ 有效地比较QString和std::string是否相等
我想有效地比较QString和std::string的(in)相等性。在不创建中间对象的情况下,哪种方法是最好的呢?QString::fromStdString()和C++ 有效地比较QString和std::string是否相等,c++,qt,std,stdstring,qstring,C++,Qt,Std,Stdstring,Qstring,我想有效地比较QString和std::string的(in)相等性。在不创建中间对象的情况下,哪种方法是最好的呢?QString::fromStdString()和QString::toststring(),但是它们会创建字符串的临时副本,因此,如果您不想拥有临时对象,您必须自己编写此函数(尽管效率更高的是一个问题) 例如: QString string="string"; std::string stdstring="string"; qDebug()<<
QString::toststring()
,但是它们会创建字符串的临时副本,因此,如果您不想拥有临时对象,您必须自己编写此函数(尽管效率更高的是一个问题)
例如:
QString string="string";
std::string stdstring="string";
qDebug()<< (string.toStdString()==stdstring); // true
QString string="string";
std::string stdstring="std string";
qDebug()<< (str==QString::fromStdString(stdstring)); // false
QString string=“string”;
std::string stdstring=“string”;
qDebug()如果您完全确定两个字符串只包含拉丁字符,则可以在没有中间对象的情况下执行此操作:
bool latinCompare(const QString& qstr, const std::string& str)
{
if( qstr.length() != (int)str.size() )
return false;
const QChar* qstrData = qstr.data();
for( int i = 0; i < qstr.length(); ++i ) {
if( qstrData[i].toLatin1() != str[i] )
return false;
}
return true;
}
bool拉丁比较(const-QString&qstr,const-std::string&str)
{
如果(qstr.length()!=(int)str.size())
返回false;
常量QChar*qstrData=qstr.data();
对于(int i=0;i
否则,您应该将std::string
解码为QString
,并比较这两个QString
,因此,您可以通过toLatin1()进行转换,而不是一次转换整个字符串逐字符。我假设这效率较低,但如果有人想分析它,我会对数字感兴趣。看看qstring.cpp中的toLatin1_助手,完整的字符串转换必须迭代字符串中的每个字符,再加上分配一个QByteArray。另一方面,相等检查是一个memcmp,并且有一个优化的SSE2的路径会有所不同(这在4.7.2中,这是我手头的,所以可能已经更改了)。我的版本可以通过使用QString::data()进行优化为了得到一个QChar*。我主要是为了达到避免临时分配的目标,但我不知道在这种情况下这是否会更快。QString使用unicode,std::string可以是任何东西,因此如果不假设std::string的内容,就无法直接定义“相等”。第一个选项,(string.toStdString()==stdstring),导致ARM上的Windows内存泄漏(不是桌面或Linux问题)。第二个选项(str==QString::fromStdString(stdstring))工作正常。