深情的绿豆 · 如何获取dataframe中最后一个索引号?· 9 月前 · |
活泼的硬盘 · python - How do you ...· 1 年前 · |
大鼻子的椅子 · Python代码规范(PEP8)问题及解决- ...· 1 年前 · |
温柔的长颈鹿 · 视频通话会议系统EasyRTC进去会议室控制 ...· 1 年前 · |
失恋的充电器 · phpstorm 自带的POST工具 ...· 1 年前 · |
我正在将我的应用程序移植到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(','));
深情的绿豆 · 如何获取dataframe中最后一个索引号? 9 月前 |