为什么使用 QVector(Qt) 而不是 std::vector

Why use QVector(Qt) instead of std::vector

本文关键字:std vector QVector Qt 为什么      更新时间:2023-10-16

我对C++和Qt很陌生,但我非常擅长C#/Java。

关键是我喜欢跨平台,但我和Qt混淆了,std::vector不是已经跨平台了吗,Qt不是提供了等同于非跨平台的东西吗?

另外,FileQFile有何不同?

链接会很好,谢谢:)

这篇文章很好。它将Qt模板库与标准模板库进行比较:

  • QTL vs STL

希望看到文章中列出的所有差异,您会发现很有趣。

编辑:

以下是我觉得有趣的事情:

我的观点是最大的 QTL 的优点是它具有 相同的实现(包括 二进制兼容性(在所有操作系统上 由Qt支持。 一些 STL 实现可能低于标准 当涉及到性能或他们 可能缺少功能。一些 平台甚至没有 STL!上 另一方面,STL更多 可定制,并可在其 整个头文件...就像我说的, 没有明显的赢家

就像他说的,没有明显的赢家。但是仍然阅读这篇文章会让很多事情变得清晰。知道区别比不了解另一个更好。

QVector 类是引用计数的,适合在不复制的情况下共享。Qt提供了很多与STL容器对应的容器。 一个描述这些内容的文档,其中包含对内部结构的一些解释和一些基本原理:

  • Qt 4容器内部

从这里:

Qt起源于C++和 标准库不是 标准化或得到良好支持 编译 器。因此,它复制了一个 现在很多东西都在 标准库,如容器 和类型信息。最 值得注意的是,他们修改了C++ 语言提供信号,以便 Qt类不能轻易地与 非Qt类。

我通过这段代码比较了矢量和Qvector,矢量比Qvector更快。在Qtcreator中实现并使用Visual Studio 2019编译器编译的代码

void qvectortest()
{
    QVector<double> s[10][100];
        for (int is = 0; is < 100000; is++)
        {

        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 100; j++)
            {
                for (int k = 0; k < 10000; k++)
                {
                    s[i][j].push_back(k);
                }
            }
        };
        QVector<double> d;
        d=s[0][0].mid(0);
        d.clear();
        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 100; j++)
            {
                s[i][j].clear();
            };
        };
        cout << "Qvector="<<is << endl;
        }
}

void vectortest()
{
    vector<double> s[10][100];
        for (int is = 0; is < 100000; is++)
        {

        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 100; j++)
            {
                for (int k = 0; k < 10000; k++)
                {
                    s[i][j].push_back(k);
                }
            }
        };
        vector<double> d;
        d.assign(s[0][0].begin(), s[0][0].end());
        d.clear();
        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 100; j++)
            {
                s[i][j].clear();
            };
        };
        cout << "vector="<<is << endl;
        }
}

操作/时间图

由于没有答案提到它,Qt容器,包括QVector通常具有更完整的API,与std::vector相比,这确实提供了一定程度的额外便利并减少了冗长。

QVector并没有真正集成到Qt API中,但这个角色是由不合适的QList承担的,所以使用QVector来更好地与Qt API兼容并不是一个强有力的论据。请注意,随着QList的缺点越来越得到承认,这种情况可能会在Qt 6中发生变化。

话虽如此,如果您已经依赖Qt进行应用程序,那么为了方便起见,使用QVector是很有意义的。我认为没有人会仅仅为一两个容器添加像Qt这样臃肿的依赖项。 QVector高效且性能稳定,并且可以在Qt支持的任何平台上毫无问题地运行。

另一方面,如果你想制作一个与框架无关的核心逻辑 API,如果可能的话,最好在标准C++中开发它,这样你就可以得到一些不绑定到特定 GUI 框架的可移植内容,这样你就可以在需要时轻松地将其迁移到不同的框架。

Qt 6更新:现在QListQVector在功能上几乎相同。

我对QTL的糟糕经历与QTL没有引发任何异常有关;这使得跟踪和修复严重错误变得更加困难。此外,STL实现与编译器密切相关,因为库的某些部分需要特定于编译器的语言扩展。这意味着STL实现通常可以胜过QTL,而需要可移植,因此不能从所述扩展中受益。不过,调试问题对我来说至关重要。

C++的std::vector是跨平台的,因为它是C++标准的一部分。 每个符合C++的编译器都必须提供它。

我不熟悉Qt,但我确实在文档中看到了这个:

注意:此类中的所有函数都是 折返。

也可能(推测(QVector类比std::vector更容易集成以容纳以Qt为中心的对象。 同样,我不熟悉Qt,所以你必须自己决定。

根据经验(有很多例外(,我倾向于使用 std::vector,除非我有令人信服的理由使用一些特定于库的容器类。