首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Qt 6中如何将QList转换为QSet

Qt 6中如何将QList转换为QSet
EN

Stack Overflow用户
提问于 2021-02-09 16:42:17
回答 2查看 4.4K关注 0票数 4

我正在将我的应用程序移植到Qt 6,当我阅读文档时,我看到很多类都被清理了,QListQVector是统一的,QStringList现在是QList<QString>的别名,等等。

但现在这给了我一个问题。

在我的代码(即Qt 5)中,我将QStringList转换为QSet,以消除列表中的重复项。我阅读了新的文档,但还没有看到将QList转换为Qt 6中的QSet的方法。

那么,如何将QList转换为QSet呢?或者这是不可能的,我将需要编写一个删除重复项的助手函数?

编辑:我正在使用QT6.0.1。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-10 09:49:56

我必须承认我还在Qt5上。

然而,QListQSet让我想起了std::liststd::set。对于后者,已经有另一种(也是更灵活的)方法来实现这样的目标:在迭代器中使用构造。在Qt6文档中进行简短的检查。让我相信,这在Qt类中也应该有效:

QSet::QSet(InputIterator first,InputIterator last)

构造一个具有迭代器范围中的内容的集合[第一,最后)。 InputIterator的值类型必须转换为T。 注意:如果范围[第一,最后)包含重复元素,则保留第一个元素。 这个功能是在Qt 5.14中引入的。

设置first的位置

::iterator QList::begin()

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

last

迭代器QList::end()

返回STL样式的迭代器,指向列表中最后一项之后的假想项。

如果组合在一起,这应该是什么样子:

代码语言:javascript
复制
QList<QString> aList;
// populate list
QSet<QString> aSet(aList.begin(), aList.end());

OP注意到Qt-5医生。已经包含了关于这方面的一个提示:

QSet QList::toSet() const

注意:从Qt5.14开始,范围构造函数可以用于Qt的泛型容器类,应该使用它来代替这个方法。

OP还提到了一个方便包装:

代码语言:javascript
复制
template <typename T>
QSet<T> QListToQSet(const QList<T>& qlist)
{
  return QSet<T> (qlist.constBegin(), qlist.constEnd());
}

适用于上述样本:

代码语言:javascript
复制
QList<QString> aList;
// populate list
QSet<QString> aSet = QListToQSet(aList);

更一般的转换工具可能如下所示:

代码语言:javascript
复制
template <typename T, template<typename> typename C>
QSet<T> toQSet(const C<T> &container)
{
  return QSet<T>(container.begin(), container.end());
}

即使在匹配的std容器中,它也能工作:

代码语言:javascript
复制
std::vector<QString> aVec = { "Hello", "World", "Hello" };
QSet<QString> aSet = toSet(aVec);
票数 5
EN

Stack Overflow用户

发布于 2021-02-09 16:56:49

你说得对,在代码文档中看到QStringList是QList的子代

代码语言:javascript
复制
class QStringList : public QList<QString>
{

因此,您可以直接调用QSet toSet() const;,因为该方法是公共的。

这样,您就可以直接将QStringlist的内容解压缩到qset

代码语言:javascript
复制
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();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66123242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档