如何在 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*/>
结构可能会提高查找性能。
我一直在尝试像这样搜索一个保存在 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*/>
结构可能会提高查找性能。