如何在 QVector 中搜索 QString

how to search a QString in QVector

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

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

我曾尝试使用查找,但它对我不起作用,IDE 未显示任何错误消息,但在调试 windwo 中,“迭代器显示”的值不可访问.

这是我迄今为止尝试过的方法,但它对我不起作用。

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

问题

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

解决方案

问题是 std::find, searches an exact match, i.e. it uses the QString::operator == (const char *) (see 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*/> 结构可能会提高查找性能。