【问题标题】:C++ elegant way for prioritized search in STL container在 STL 容器中优先搜索的 C++ 优雅方式
【发布时间】:2020-09-11 06:17:09
【问题描述】:

我写了一个小函数,其目的是按顺序遍历一个元素列表,对它的 hashmap 值进行一些检查,如果它们通过,则返回它。

QString ElementContainer::getPreferedAvailableElement() const
{
    QStringList preferred_priority = { A, B, C, D, E };
    foreach(QString element, preferred_priority){
        Element*  data = m_hashmap.value(element, nullptr);
        if(data && data->isReady()){
            return element;
        }
    }
    return QString("");
}

我知道那些功能类型的 std 函数不应该被强制使用,无论它是否有意义。我只是好奇你如何改变它,如果它可能更冗长。

【问题讨论】:

  • 能否请您重新表述您的问题?目前尚不清楚您要实现什么目标,到目前为止您做了什么以及存在什么问题。
  • 您似乎正在c++03 中编写代码,这是它的 Qt 变体(带有各种宏)。这是对解决方案的限制吗?
  • @Hack06 我试图实现的目标:找到与 isReady 标准匹配的 hashmap 的第一个元素,按照 Preferred_priority 列表的顺序进行。到目前为止我所做的已经在上面列出,这是一种天真的方式。我的问题是,是否有一种更易读、更详细、更简洁的方式来写这篇文章。
  • @Yakk-AdamNevraumont 它确实是带有 C++11 的 Qt 变体。 QStringList 中的元素不是宏而是常量。我猜应该没关系。
  • 例如,@Curunir foreach 是一个 QT 宏。在 C++11 中不需要它:for(QString element:preferred_priority) 是一个无宏示例。

标签: c++ qt c++11


【解决方案1】:

你可以像这样使用std::find_if

QString ElementContainer::getPreferedAvailableElement() const
{
   QStringList preferred_priority = { A, B, C, D, E };
   auto it = std::find_if(preferred_priority.begin(), 
      preferred_priority.end(), 
      [this](const QString & element)
   { 
      Element* data = m_hashmap.value(element, nullptr);
      return (data && data->isReady());
   });

   if (it != preferred_priority.end())
   {
      return *it;
   }

   return QString("");
}

【讨论】:

  • 正是我要找的东西,我不知道要在 std 命名空间中搜索什么。谢谢。
猜你喜欢
  • 1970-01-01
  • 2014-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 2010-09-17
  • 2016-04-13
相关资源
最近更新 更多