如何解决如何在 Qt 6 中将 QList 转换为 QSet
我正在将我的应用程序移植到 Qt 6,当我阅读文档时,我看到类被清理了很多,QList
和 QVector
是统一的,QStringList
现在是别名QList<QString>
等等。
但现在这给我带来了一个问题。
在我的代码(即 Qt 5)中,我将 QStringList
转换为 QSet
以消除列表中的重复项。我浏览了新文档,但我还没有看到在 Qt 6 中将 QList
转换为 QSet
的方法。
那么如何将 QList
转换为 QSet
?或者这是不可能的,我需要编写一个帮助函数来删除重复项?
编辑:我使用的是 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) 包含重复元素,则保留第一个。
该函数是在 Qt 5.14 中引入的。
其中 first
设置为
QList::iterator QList::begin()
返回指向列表中第一项的 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);
,
你是对的,在 code 或 doc 中看到 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();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。