- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我需要一个映射,其中的键是唯一的,每个键都是一个集合或一个包含 3 个数据项的自定义 POD 结构。这些值只是指向对象实例的指针。
来自阅读docs for Qt's QMap vs QHash , 看起来好像我使用 QSet作为我 map 中的键,那么我应该使用 QHash,因为 QSet 提供了 operator==()
但不是 operator<()
.这是一个公平的假设吗?然而,文档还说 QHash 需要一个“名为 qHash()” 的全局 qHash 函数,但我不清楚这是如何提供的,或者它是否是 QSet 的隐含部分?
如果我使用一个简单的结构作为我的键,我会遇到同样的问题来处理 qHash()
,虽然一个简单的 POD 结构应该隐含地具有可接受的重载 operator==()
这只是比较所有数据,对吗?
如果您能给我一些关于最佳方法的建议,我将不胜感激。
最佳答案
我建议使用 QHash
除非你需要对你的键进行排序(我假设你不需要)。
operator==
函数已经由 QSet
提供,假设由集合管理的类也定义了该运算符(所有基本数据类型和 QString
等都有)。
Two sets are considered equal if they contain the same elements.
This function requires the value type to implement operator==().
你仍然需要提供通常定义如下的qHash()
函数:
inline uint qHash( QSet<whatever> set )
{
return /* calculate a hash based on all the elements. */
}
这个定义实际上可以放在任何地方,只要定义 QHash
的代码包含包含该定义的文件即可。如果您有一个自己的类用于此示例中被引用为 whatever
的内容,您可以将该定义放在例如在你的类定义后面。
注意qHash
函数只需要保证等式obj1 == obj2
的结果总是等于qHash(obj1)的结果== qHash(obj2)
.
这意味着您不必生成唯一的哈希值,但文档中有以下注释:
However, to obtain good performance, the qHash() function should attempt to return different hash values for different keys to the largest extent possible.
我为一组存储字符串编写了一个小型测试应用程序:
#include <QtCore/QSet>
#include <QtCore/QHash>
#include <QtCore/QList>
#include <QtCore/QDebug>
typedef QSet<QString> QStringSet;
typedef QHash< QStringSet, QObject* > QStringSetToObjectHash;
inline uint qHash( const QStringSet mySet )
{
// convert the set to a list so we can sort and iterate over it
QList<QString> mySetAsList = mySet.toList();
qSort( mySetAsList );
// take the hash of the first item
uint result = qHash( mySetAsList.first() );
// for each remaining element in the list
for( int index = 1; index < mySetAsList.count(); index++ )
{
// XOR the current result with the hash of the next item
result ^= qHash( mySetAsList.at( index ) );
}
return result;
}
void insertIntoHash( QStringSetToObjectHash& hash, const QStringSet& key, QObject* const value )
{
qDebug() << "---------------------------------";
qDebug() << "Element hash value:" << qHash( key );
foreach( QStringSet existingKey, hash.keys() )
{
if( existingKey == key )
{
qDebug() << "Similar element found using == operator. QHash will not store that item twice";
}
}
hash.insert( key, value );
qDebug() << "QHash count:" << hash.count();
}
int main(int argc, char *argv[])
{
QStringSetToObjectHash testHash;
QObject dummy;
QStringSet testSet;
testSet.insert( "1" );
testSet.insert( "12" );
insertIntoHash( testHash, testSet, &dummy );
QStringSet testSet2( testSet );
insertIntoHash( testHash, testSet2, &dummy );
QStringSet testSet3;
testSet3.insert( "12" );
testSet3.insert( "1" );
insertIntoHash( testHash, testSet3, &dummy );
QStringSet testSet4;
testSet4.insert( "1" );
testSet4.insert( "2" );
testSet4.insert( "3" );
insertIntoHash( testHash, testSet4, &dummy );
}
这会产生以下输出:
---------------------------------
Element hash value: 883
QHash count: 1
---------------------------------
Element hash value: 883 Similar element found using == operator. QHash will not store that item twice
QHash count: 1
---------------------------------
Element hash value: 883 Similar element found using == operator. QHash will not store that item twice
QHash count: 1
---------------------------------
Element hash value: 48
QHash count: 2
关于c++ - 使用 QSet 作为 Qt 映射容器中的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22242082/
有没有办法设置 QSettings 存储的实际默认路径(有或没有文件名),并防止 QSettings 将组织名称等内容附加到该路径?这要求 QSettings 的进一步使用保持不变并且不知道设置存储路
你好,我有一个由应用程序生成的 Mac OS X plist 文件 (QSetting::NativeFormat),现在我想在不支持它的基于 Linux 的操作系统上使用这个 plist 文件。所以
Qt 错误报告链接:QTBUG-53313 从 Qt 5.5 迁移到 Qt 5.6 会出现一个问题 QSettings它在系统范围内找不到 QSettings 配置文件。在下面的 main.cpp 中
我程序里的设置挺多的,大概有3000个。它们不应该在程序开始时立即阅读,而是在需要时在程序的 10 个不同位置阅读。我想知道执行此操作的在性能/内存使用方面最有效的方法是什么: 1 始终打开一个“全局
我想用QSettings保存高分,但它不能正常工作。我在 2 个不同的文件中保存和读取这些值。 这是我负责将值添加到数组中的代码: QSettings settings; settings.begin
我从某个位置上传文件,然后下一次上传必须指向上次上传的位置。 我怎样才能使用 QSettings 来实现? ? 最佳答案 在使用 QSettings 之前,我建议在您的 main() 中设置一些有关您
我有 ini 格式的 QSettings 对象。 当我在 ini 文件中写入 settings.beginGroup("GENERAL") 时,我看到以下内容: [%常规] 为什么会这样? 最佳答案
我正在尝试为 QSettings 创建自定义格式,但无法从存储中读取它。 在下面的代码中,如果我运行 settings.setValue("test", 123") ,它会正确调用 write 函数并
我正在使用QSettings在Windows中将某些数据存储为ini文件。 我想查看ini文件,但我不知道ini文件的位置。 这是我的代码: QSettings *set = new QSetting
我使用 QSettings 来编辑 .desktop 菜单条目。我这样做: dfile 是一个 QString - 绝对文件路径 QSettings set(dfile, QSettings::Ini
我正在尝试在我的代码中使用 QSettings,但它无法正常工作。我的代码是: In Mainwindow.h QSettings settings (我已经在所有setOrganizationNam
我正在使用非图形用户界面产品的 Qsettings 将其设置存储到 xml 文件中。这是作为一个库编写的,可在 C、C++ 程序中使用。每个产品将有 1 个 xml 文件。每个产品可能有多个子产品,它
我想知道为什么这段基于虚假公司名称和应用程序名称创建 Qt 设置实例的代码不起作用。 这里是mainwindow.h,还有一个main.cpp,还有mainwindow.cpp,一个.pro文件,.u
我正在使用 Qsetting 来存储上次使用的值。我的代码只适用于一个领域。这意味着当我为第二轮应用相同的逻辑时它只工作一次,但它不会那样做。 文件io.cpp #include "fileio.h"
Does Qt has something like QSettings, but for local scopes? 我正在寻找具有相同方法但不特定于 APPLICATION 的数据结构。 我的意思
QSettings settings("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run",QSettings::Nati
有没有办法使用 QSettings 为每个键存储多个值,并将其存储在人类可读(无二进制文件).ini 文件中? 可能看起来像: key_1=value_1,value2 key_2=value_1 .
我正在尝试为我的 Qt 应用程序实现应用程序设置。我正在使用 QSettings ,像这样创建了我的类的实例 settings = new QSettings(qApp->organizationNa
我正在使用 QSettings 编写一个 .ini 文件,它将作为我的应用程序配置文件。只有一个问题: QSettings 将组名 [General] 添加到文件的顶部。 我这样设置文件: QSett
我编写了一个简单的应用程序来使用 QSettings。谁能告诉我我在这里做错了什么.. 主窗口.h class MainWindow : public QMainWindow { Q_OBJE
我是一名优秀的程序员,十分优秀!