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

dos*_*rog 6 c++ qt list set qt6

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

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

在我的代码(Qt 5)中,我正在转换QStringListQSet消除列表中的重复项。我浏览了新文档,但还没有找到在 Qt 6 中转换的QList方法QSet

那么如何转换QListQSet?或者这是不可能的,我需要编写一个辅助函数来删除重复项?

编辑:我正在使用 Qt 6.0.1。

Sch*_*eff 6

我必须承认我仍在使用 Qt5。

然而,QListQSet提醒我强烈地std::liststd::set。对于后者,已经有另一种(并且更灵活)的方法来实现这些事情:使用迭代器的构造。对 Qt6 文档进行简短检查。让我确信,这也应该适用于 Qt 类:

QSet::QSet(首先输入迭代器,最后输入迭代器)

使用迭代器范围 [first, last) 中的内容构造一个集合。

InputIterator 的值类型必须可转换为 T。

注意:如果范围[first,last)包含重复元素,则保留第一个。

该功能是在 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());
Run Code Online (Sandbox Code Playgroud)

OP 指出 Qt-5 文档。已经包含了与此相关的提示:

QSet QList::toSet() const

注意:从 Qt 5.14 开始,范围构造函数可用于 Qt 的通用容器类,并且应该用来代替此方法。

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

template <typename T>
QSet<T> QListToQSet(const QList<T>& qlist)
{
  return QSet<T> (qlist.constBegin(), qlist.constEnd());
}
Run Code Online (Sandbox Code Playgroud)

应用于上述示例:

QList<QString> aList;
// populate list
QSet<QString> aSet = QListToQSet(aList);
Run Code Online (Sandbox Code Playgroud)

更通用的转换工具可能是这样的:

template <typename T, template<typename> typename C>
QSet<T> toQSet(const C<T> &container)
{
  return QSet<T>(container.begin(), container.end());
}
Run Code Online (Sandbox Code Playgroud)

std即使与匹配的容器一起使用也可以:

std::vector<QString> aVec = { "Hello", "World", "Hello" };
QSet<QString> aSet = toSet(aVec);
Run Code Online (Sandbox Code Playgroud)