【问题标题】:Generic Search Algorithms for Qt container classesQt 容器类的通用搜索算法
【发布时间】:2016-06-02 06:36:53
【问题描述】:

STL 使用多种函数来查找容器类中的元素。 Qt 5.5 容器类中是否有类似的功能,例如QListQVector?

特别是,我正在寻找一个等效的单线,即std::find_if 使用 Qt 容器和 Qt 算法:

int main(int arg, char** args) {
    std::vector<int> c = { 2,3,4,6,6,15 };
    if (std::find_if(c.begin(), c.end(), [](const int& value) { return value % 5 == 0; }) != c.end()) {
        std::cout << "At least one element divisible by 5." << std::endl;
    } else {
        std::cout << "No element is divisible by 5." << std::endl;
    }
    return 0;
}

一个元素的谓词可以被5整除应该只是作为一个例子。

Qt 框架是否提供了这么好的算法?

【问题讨论】:

  • 为什么要让 Qt 复制 STL 算法?只需在 Qt 容器(例如 QVector)上使用 std::find_if,它就可以正常工作。还有QVector::indexOf和其他一些,我没有找到find_if的版本。
  • 是的。我也是。我在问自己,如果我无法在文档中正确搜索。也许我真的必须在QVectorstd::vector 之间来回转换。
  • @FrankSimon 为什么要将 / 转换为 std::vector?您可以使用QVector 直接致电std::find_if
  • 啊。现在我明白了。 QVector 接口与STL 兼容?这真是巧妙。
  • 值得一提的是,Qt 早先提供了与 STL 算法等效的 doc.qt.io/qt-5/qtalgorithms.html#details,但从 Qt 5.0 开始鼓励直接使用 STL 实现

标签: c++ qt stl containers


【解决方案1】:

algorithm 标头中定义的 STL 算法可用于 Qt 容器。如果 Qt 缺少等效算法,则没有理由避免使用 STL 算法。如果 Qt 是用 STL 支持构建的,它应该默认工作。

#include <algorithm> // std::find_if
#include <QApplication>
#include <QVector>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QVector<int> c{ 2,3,4,6,6,15 };
    if (std::find_if(c.begin(), c.end(), [](const int& value) { return value % 5 == 0; }) != c.end()) {
        ...
    }
    return app.exec();
}

【讨论】:

  • 这里的其他人已经指出了这一点。见 cmets。谢谢回复。我已经找到了可行的解决方案,真的很简单。
【解决方案2】:

标准 C++ 算法适用于任何满足给定算法要求的容器。相关的标准容器在这里并不特殊:它们恰好满足要求。就像 Qt 容器和许多其他容器一样。无论如何,您都应该在工作过程中编写自己的容器或迭代器适配器,特别是为了利用标准算法。

例如,您可以为QGraphicsSceneQLayout 创建一个迭代器适配器,或者必须创建an iterator for circular data structures

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    相关资源
    最近更新 更多