【问题标题】:QMap function: check it contains isbn numberQMap 函数:检查它是否包含 isbn 编号
【发布时间】:2013-04-19 10:27:04
【问题描述】:

我正在尝试编写一个函数来确定给定的 isbn 编号是否在 QMap 列表中,我发现我没有正确使用 contains,不确定这是否符合逻辑?

bool TextbookMap::foundTextBook(QString isbn) const {
    bool found = false;
    ConstIterator itr = constBegin();
    for ( ; itr != constEnd(); ++itr)
    {
         if (itr.contains(isbn))
             found = true;
    }
    return found;
}

【问题讨论】:

  • 这是一个糟糕的实现,因为即使您找到了条目,您也会继续搜索。使for 循环条件itr != constEnd() && !found

标签: c++ qt qmap


【解决方案1】:

您不需要迭代地图 - 这是contains() 已经为您所做的。只需使用

bool TextbookMap::foundTextBook(const QString& isbn) const {
   return contains(isbn);
}

(我假设您从QMap 派生了TextbookMap

下面的代码打印

false
true

class Textbook {
};

class TextbookMap : public QMap<QString, Textbook*> {
public:
    bool foundTextBook(const QString& isbn) const;
};

bool TextbookMap::foundTextBook(const QString& isbn) const {
    return contains(isbn);
}

int main(int argc, char ** argv) {
    TextbookMap map;
    map.insert("1234", new Textbook());
    map.insert("5678", new Textbook());
    qDebug() << map.foundTextBook("01234");
    qDebug() << map.foundTextBook("1234");

    return 0;
}

在这个例子中,你甚至不需要实现一个单独的方法——你也可以直接使用map.contains()。但是像这样封装contains() 方法是否有意义取决于您的具体要求。附带说明一下,我通常会尽量避免从容器类派生,而是使用委托。

【讨论】:

  • TextbookMap 的第一行类定义是:
  • 类 TextbookMap : public QMap
  • 我已经调整了示例 - 最后,这与 foundTextBook() 方法的一般设计无关。我也可以使用任何其他类型,例如 QString 作为地图的值类型。
  • 建议不要从容器类派生的奖励积分 - 这是一个非常好的建议,它应该在响应中占据更突出的位置:)
猜你喜欢
  • 2019-03-13
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 2018-08-21
  • 1970-01-01
相关资源
最近更新 更多