簡體   English   中英

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

[英]Why use QVector(Qt) instead of std::vector

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

關鍵是我喜歡跨平台,但我對 Qt 感到困惑。 std::vector不是已經跨平台了嗎,Qt 不提供與非跨平台的東西等效的東西嗎?

另外FileQFile有什么不同?

一個鏈接會很好,謝謝:)

這篇文章看起來不錯。 它將 Qt 模板庫與標准模板庫進行了比較:

希望您會發現看到文章中列出的所有差異會很有趣。

編輯:

以下是我覺得有趣的地方:

我認為QTL 的最大優勢在於它在 Qt 支持的所有操作系統上具有相同的實現(包括二進制兼容性) 一些 STL 實現在性能方面可能低於標准,或者它們可能缺少功能。 有些平台甚至沒有 STL! 另一方面,STL 更具可定制性,並且可以在頭文件中完整使用……就像我說的那樣,沒有明確的贏家

就像他說的,沒有明顯的贏家。 但是仍然閱讀這篇文章可以使很多事情變得清晰。 知道其中的區別總比不知道另一個更好。

QVector 類是引用計數的,適合在不復制的情況下共享。 Qt提供了很多與STL容器對應的容器。 一份描述這些內容的文檔,其中包含一些內部原理的解釋和一些基本原理:

這里開始

Qt 起源於 C++ 和標准庫沒有被編譯器標准化或很好支持的時代。 因此,它復制了許多現在在標准庫中的東西,例如容器和類型信息。 最重要的是,他們修改了 C++ 語言以提供信號,因此 Qt 類不能輕易地與非 Qt 類一起使用。

我在QTL方面的糟糕經歷與QTL沒有引發任何異常有關; 這使得追蹤和修復嚴重錯誤變得更加困難。 此外, STL實現與編譯器密切相關,因為庫的某些部分需要對語言進行特定於編譯器的擴展。 這意味着STL實現通常可以勝過QTL ,后者需要可移植,因此無法從所述擴展中受益。 不過,調試問題對我來說很關鍵。

由於沒有答案提及,包括QVector在內的 Qt 容器通常具有更完整的 API,與std::vector相比,它確實提供了一定程度的額外便利並減少了冗長。

QVector並沒有真正集成到 Qt API 中,該角色由 misfit QList承擔,因此使用QVector來獲得與 Qt API 的整體更好兼容性並不是一個強有力的論據。 請注意,這可能會在 Qt 6 中發生變化,因為QList的缺點越來越得到認可。

話雖如此,如果您的應用程序已經依賴 Qt,那么為了方便起見,使用QVector會很有意義。 我認為沒有人會為一兩個容器添加像 Qt 這樣臃腫的依賴項。 QVector高效且性能穩定,在 Qt 支持的任何平台上都可以毫無問題地運行。

另一方面,如果你想創建一個與框架無關的核心邏輯 API,如果可能的話,用標准 C++ 開發它是一個好主意,這樣你就會得到一些不依賴於特定 GUI 框架的可移植的東西,所以如果需要,您可以在將來輕松地將其遷移到另一個。

C++ 的std::vector是跨平台的,因為它是 C++ 標准的一部分。 每個符合 C++ 標准的編譯器都必須提供它。

我不熟悉 Qt,但我確實在文檔中看到了這一點:

注意:該類中的所有函數都是可重入的。

也有可能(推測)QVector 類比std::vector更容易集成以保存以 Qt 為中心的對象。 同樣,我不熟悉 Qt,所以你必須自己決定。

根據經驗(有很多例外),我傾向於使用std::vector ,除非我有令人信服的理由使用某些特定於庫的容器類。

我通過這段代碼比較 Vector 和 Qvector,vector 比 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;
        }
}

操作/時間圖

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM