簡體   English   中英

如何在 Qt 6 中將 QList 轉換為 QSet

[英]How to convert QList to QSet in Qt 6

我正在將我的應用程序移植到 Qt 6 並且當我閱讀文檔時,我看到類被清理了很多, QListQVector是統一的, QStringList現在是QList<QString>的別名等等。

但是現在這給了我一個問題。

在我的代碼(即 Qt 5)中,我將QStringList轉換為QSet以消除列表中的重復項。 我瀏覽了新文檔,但我還沒有看到在 Qt 6 中將QList轉換為QSet的方法。

那么如何將QList轉換為QSet 或者這是不可能的,我需要編寫一個幫助程序 function 來刪除重復項?

編輯:我正在使用 Qt 6.0.1。

我必須承認我還在 Qt5 上。

但是, QListQSet提醒我強烈std::liststd::set 對於后者,已經有另一種(並且更靈活)的方式來實現這些目標:使用帶有迭代器的構造。 Qt6 文檔中的簡短檢查。 說服我,這也應該在 Qt 類中工作:

QSet::QSet(InputIterator first, InputIterator last)

使用迭代器范圍 [first, last) 中的內容構造一個集合。

InputIterator 的值類型必須可轉換為 T。

注意:如果范圍 [first, last) 包含重復元素,則保留第一個元素。

此 function 在 Qt 5.14 中引入。

first設置為

QList::迭代器 QList::begin()

返回指向列表中第一項的 STL 樣式迭代器。

last

QList::迭代器 QList::end()

返回一個 STL 風格的迭代器,指向列表中最后一項之后的虛構項。

放在一起應該是什么樣子:

QList<QString> aList;
// populate list
QSet<QString> aSet(aList.begin(), aList.end());

OP 注意到 Qt-5 文檔。 已經包含有關此的提示:

QSet QList::toSet() 常量

注意:自 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.

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