我必须承认我还在使用 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::迭代器 QList::begin()
返回指向列表中第一项的 STL 样式迭代器。
并last
与
QList::迭代器 QList::end()
返回一个 STL 风格的迭代器,指向列表中最后一项之后的虚构项。
放在一起应该是什么样子:
QList<QString> aList;
// populate list
QSet<QString> aSet(aList.begin(), aList.end());
OP 注意到 Qt-5 文档。已经包含有关此的提示:
QSet QList::toSet() 常量
注意:从 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);