如何在QVector中搜索QString

问题描述

我一直在尝试搜索像这样保存在QVector中的字符串的ID

QVector<QString> logMessages;
 
logMessages.append("1- Message");
logMessages.append("2- Message");
logMessages.append("3- Message");
logMessages.append("4- Message");  

我尝试使用查找,但是它对我不起作用,IDE不会显示任何错误消息,但是在调试窗口中,“迭代器显示”无法访问“的值。

这是我到目前为止尝试过的方法,但是对我而言无效。

QVector<QString>::iterator it = std::find(logMessages.begin(),logMessages.end(),"2");
if(it != logMessages.end())
{
    int index = std::distance(logMessages.begin(),it);
}

解决方法

问题

迭代器不可访问,可能意味着迭代器指向向量的末尾,即在向量中找不到元素。

解决方案

问题是std::find搜索完全匹配的内容,即它使用了QString::operator == (const char *)(请参见Comparing strings)。

您正在寻找starts with“ 2-”的字符串。因此,您必须使用std::find_if和f.ex指定自定义的相等性检查。 Lambda函数:

QVector<QString>::iterator it = std::find_if(logMessages.begin(),logMessages.end(),[](const QString& s){
  return s.startsWith("2-"); // check if the element starts with "2-"
});

性能考量

请注意,std::find_if使用O(N)的性能较慢(对于大型阵列)。使用QHash<int /*id*/,QString /*message*/>结构可以提高您的查询性能。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...