首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使QList<QVector3D>成为唯一的

如何使QList<QVector3D>成为唯一的
EN

Stack Overflow用户
提问于 2013-08-13 08:20:56
回答 3查看 2K关注 0票数 5

我有一个由QList组成的QVector3DQVector3D表示顶点或点。这个列表也包含一个STL-File的所有顶点。问题是一个顶点在列表中存在多次。需要一个STL-文件的唯一顶点列表。如何用Qt 5.0.2实现它?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-13 09:46:28

QSet使用散列函数来确保值的唯一性(QMap使用操作符<)在Qt中没有QVector3D的qHash实现。您可以实现您自己的一个,例如:

代码语言:javascript
复制
//place anywhere in Qt-code
#include <QSet>
#include <QVector3D>
#include <QList>

uint qHash(const QVector3D &v)
{
    return qHash( QString( "%1x%2x%3" ).arg(v.x()).arg(v.y()).arg(v.z()) ) ;
}

int foo()
{
    QList<QVector3D> uvector3D_1;
    QSet<QVector3D> uvector3D_2;

    uvector3D_2 = QSet<QVector3D>::fromList(uvector3D_1);
return 0;
}

static int testFoo = foo();

当然,它不是最快的,它依赖于Qt的函数qHash作为QString。但我觉得这对示范是有好处的。

票数 6
EN

Stack Overflow用户

发布于 2013-08-13 08:29:34

代码语言:javascript
复制
QList<QVector3D> originalVector = ...;

然后要么:

代码语言:javascript
复制
QSet<QVector3D> noDublicatesSet = QSet<QVector3D>::fromList(originalVector);

代码语言:javascript
复制
QSet<QVector3D> noDublicatesSet = originalVector.toSet();

此外,如果需要返回QList,也可以添加类似的内容。

代码语言:javascript
复制
QList<QVector3D> destinationVector = QList<QVector3D>::fromSet(noDublicatesSet);

你也需要那些东西(对不起,我的密码里有很长时间了。)忘记它们是外部的)。您可能需要更改散列函数:

代码语言:javascript
复制
#define ROTL10(x) (((x) << 10) | (((x) >> 22) & 0x000000ff))
#define ROTL20(x) (((x) << 20) | (((x) >> 12) & 0x0000ffff))

uint qHash(double data)
{
union U {
    quint64 n;
    double f;
};
U u;
u.f = data;
return u.f;
}

inline uint qHash(const QVector3D &v, uint seed)
{
return qHash(v.x()) ^ ROTL10(qHash(v.y())) ^ ROTL20(qHash(v.z()));
}

这是QT5.0的代码,实际上是为向量添加缺失的qHash(),这就是为什么它们在默认情况下不适合QSet/QHash

票数 1
EN

Stack Overflow用户

发布于 2022-03-27 10:18:58

从Qt 5.14开始,您可以使用新的构造函数

template <typename InputIterator> QSet::QSet(InputIterator first, InputIterator last

下面是从文档获取的一个示例

代码语言:javascript
复制
// For example, if you have code like

QStringList list;

QSet<QString> set = QSet<QString>::fromList(list);

// you can rewrite it as

QStringList list;

QSet<QString> set(list.begin(), list.end());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18204019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档