[英]How to convert QList to QSet in Qt 6
我正在將我的應用程序移植到 Qt 6 並且當我閱讀文檔時,我看到類被清理了很多, QList
和QVector
是統一的, QStringList
現在是QList<QString>
的別名等等。
但是現在這給了我一個問題。
在我的代碼(即 Qt 5)中,我將QStringList
轉換為QSet
以消除列表中的重復項。 我瀏覽了新文檔,但我還沒有看到在 Qt 6 中將QList
轉換為QSet
的方法。
那么如何將QList
轉換為QSet
? 或者這是不可能的,我需要編寫一個幫助程序 function 來刪除重復項?
編輯:我正在使用 Qt 6.0.1。
我必須承認我還在 Qt5 上。
但是, QList
和QSet
提醒我強烈std::list
和std::set
。 對於后者,已經有另一種(並且更靈活)的方式來實現這些目標:使用帶有迭代器的構造。 Qt6 文檔中的簡短檢查。 說服我,這也應該在 Qt 類中工作:
QSet::QSet(InputIterator first, InputIterator last)
使用迭代器范圍 [first, last) 中的內容構造一個集合。
InputIterator 的值類型必須可轉換為 T。
注意:如果范圍 [first, last) 包含重復元素,則保留第一個元素。
此 function 在 Qt 5.14 中引入。
first
設置為
返回指向列表中第一項的 STL 樣式迭代器。
last
是
返回一個 STL 風格的迭代器,指向列表中最后一項之后的虛構項。
放在一起應該是什么樣子:
QList<QString> aList;
// populate list
QSet<QString> aSet(aList.begin(), aList.end());
OP 注意到 Qt-5 文檔。 已經包含有關此的提示:
注意:自 Qt 5.14 起,范圍構造函數可用於 Qt 的通用容器類,應使用此方法代替。
OP 還提到了一個方便的包裝器:
template <typename T>
QSet<T> QListToQSet(const QList<T>& qlist)
{
return QSet<T> (qlist.constBegin(), qlist.constEnd());
}
應用於上述樣本:
QList<QString> aList;
// populate list
QSet<QString> aSet = QListToQSet(aList);
更通用的轉換工具可能是這樣的:
template <typename T, template<typename> typename C>
QSet<T> toQSet(const C<T> &container)
{
return QSet<T>(container.begin(), container.end());
}
即使與匹配的std
容器也可以使用:
std::vector<QString> aVec = { "Hello", "World", "Hello" };
QSet<QString> aSet = toSet(aVec);
你是對的,在代碼或文檔中看到 QStringList 是 QList 的孩子
class QStringList : public QList<QString>
{
所以你可以調用 QSet toSet() const; 直接因為方法是公開的。
有了這個,您可以直接將QStringlist的內容解壓縮到qset
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QString str = "one,two,three,four,one";
QStringList strlt = str.split(QChar(','));
const QSet<QString> strVe = strlt.toSet();
qDebug() << strVe;
return a.exec();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.