dos*_*rog 6 c++ qt list set qt6
我正在将我的应用程序移植到 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 类:
使用迭代器范围 [first, last) 中的内容构造一个集合。
InputIterator 的值类型必须可转换为 T。
注意:如果范围[first,last)包含重复元素,则保留第一个。
该功能是在 Qt 5.14 中引入的。
其中first设置为
返回指向列表中第一项的 STL 样式迭代器。
与last
返回一个 STL 风格的迭代器,指向列表中最后一项之后的虚构项。
放在一起时应该是什么样子:
QList<QString> aList;
// populate list
QSet<QString> aSet(aList.begin(), aList.end());
Run Code Online (Sandbox Code Playgroud)
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());
}
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)
| 归档时间: |
|
| 查看次数: |
7989 次 |
| 最近记录: |