问题描述
我一直在尝试搜索像这样保存在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*/>
结构可以提高您的查询性能。