我正在将我的应用程序移植到Qt 6,当我阅读文档时,我看到很多类都被清理了,QList
和QVector
是统一的,QStringList
现在是QList<QString>
的别名,等等。
但现在这给了我一个问题。
在我的代码(即Qt 5)中,我将QStringList
转换为QSet
,以消除列表中的重复项。我阅读了新的文档,但还没有看到将QList
转换为Qt 6中的QSet
的方法。
那么,如何将QList
转换为QSet
呢?或者这是不可能的,我将需要编写一个删除重复项的助手函数?
编辑:我正在使用QT6.0.1。
发布于 2021-02-10 09:49:56
我必须承认我还在Qt5上。
然而,QList
和QSet
让我想起了std::list
和std::set
。对于后者,已经有另一种(也是更灵活的)方法来实现这样的目标:在迭代器中使用构造。在Qt6文档中进行简短的检查。让我相信,这在Qt类中也应该有效:
QSet::QSet(InputIterator first,InputIterator last)
构造一个具有迭代器范围中的内容的集合[第一,最后)。 InputIterator的值类型必须转换为T。 注意:如果范围[第一,最后)包含重复元素,则保留第一个元素。 这个功能是在Qt 5.14中引入的。
设置first
的位置
返回指向列表中第一项的STL样式迭代器。
和last
与
返回STL样式的迭代器,指向列表中最后一项之后的假想项。
如果组合在一起,这应该是什么样子:
QList<QString> aList;
// populate list
QSet<QString> aSet(aList.begin(), aList.end());
OP注意到Qt-5医生。已经包含了关于这方面的一个提示:
注意:从Qt5.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);
发布于 2021-02-09 16:56:49
你说得对,在代码或文档中看到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();
}
https://stackoverflow.com/questions/66123242
复制相似问题