【问题标题】:how to search a QString in QVector如何在 QVector 中搜索 QString
【发布时间】:2021-02-20 16:49:35
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • QVector::iterator it = std::find(logMessages.begin(), logMessages.end(), "2- Message");
  • @OP 我倾向于将其作为拼写错误关闭,除非您确认您实际上是在尝试查找 "2" 而不是 "2- Message"
  • @MohammadA.Dkman 这不是很清楚。 “迭代器不可访问”听起来像是编译器错误消息,但在上面你说它是一个“返回值”。你到底是什么意思?描述问题时尽量准确。
  • @MohammadA.Dkman 好的,这有帮助。哪一行代码在调试器中触发了该消息?
  • 您可以尝试std::find_if,它可以让您指定更复杂的条件来查找某些内容,或者您​​可以只编写一个 for 循环和一个 if 语句。如果您是初学者,后者更简单。

标签: c++ qt qstring qvector


【解决方案1】:

问题

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

解决方案

问题在于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&lt;int /*id*/, QString /*message*/&gt; 结构可能会提高您的查找性能。

【讨论】:

  • 我刚刚使用了startsWith() 函数解决了我的问题。非常感谢@m7913d
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-10
  • 1970-01-01
  • 2013-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
相关资源
最近更新 更多