[英]Why use QVector(Qt) instead of std::vector
我對 C++ 和 Qt 很陌生,但我非常擅長 C#/Java。
關鍵是我喜歡跨平台,但我對 Qt 感到困惑。 std::vector
不是已經跨平台了嗎,Qt 不提供與非跨平台的東西等效的東西嗎?
另外File
和QFile
有什么不同?
一個鏈接會很好,謝謝:)
這篇文章看起來不錯。 它將 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.