QHash Class
template <typename Key, typename T> class QHashQHash クラスは、ハッシュテーブルに基づく辞書を提供するテンプレートクラスです。詳細...
| ヘッダー: | #include <QHash> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
- 継承されたメンバーを含む、すべてのメンバーの一覧
- 非推奨のメンバ
- QHashは、「暗黙的に共有されるクラス」および「コンテナクラス」の一部です。
注:このクラスのすべての関数は再入可能です。
QHash の比較
| カテゴリ | 比較可能な型 |
|---|---|
| 等価性 | QHash |
パブリック型
(since 6.9) struct | TryEmplaceResult |
| class | const_iterator |
| class | iterator |
| class | key_iterator |
| ConstIterator | |
| Iterator | |
| const_key_value_iterator | |
| difference_type | |
| key_type | |
| key_value_iterator | |
| mapped_type | |
| size_type |
パブリック関数
| QHash() | |
| QHash(std::initializer_list<std::pair<Key, T>> list) | |
| QHash(InputIterator begin, InputIterator end) | |
| QHash(const QHash<Key, T> &other) | |
| QHash(QHash<Key, T> &&other) | |
| ~QHash() | |
(since 6.4) auto | asKeyValueRange() && |
(since 6.4) auto | asKeyValueRange() & |
(since 6.4) auto | asKeyValueRange() const && |
(since 6.4) auto | asKeyValueRange() const & |
| QHash<Key, T>::iterator | begin() |
| QHash<Key, T>::const_iterator | begin() const |
| qsizetype | capacity() const |
| QHash<Key, T>::const_iterator | cbegin() const |
| QHash<Key, T>::const_iterator | cend() const |
| void | clear() |
| QHash<Key, T>::const_iterator | constBegin() const |
| QHash<Key, T>::const_iterator | constEnd() const |
| QHash<Key, T>::const_iterator | constFind(const Key &key) const |
| QHash<Key, T>::const_key_value_iterator | constKeyValueBegin() const |
| QHash<Key, T>::const_key_value_iterator | constKeyValueEnd() const |
| bool | contains(const Key &key) const |
| qsizetype | count(const Key &key) const |
| qsizetype | count() const |
| QHash<Key, T>::iterator | emplace(Key &&key, Args &&... args) |
| QHash<Key, T>::iterator | emplace(const Key &key, Args &&... args) |
| bool | empty() const |
| QHash<Key, T>::iterator | end() |
| QHash<Key, T>::const_iterator | end() const |
| QHash<Key, T>::iterator | erase(QHash<Key, T>::const_iterator pos) |
| QHash<Key, T>::iterator | find(const Key &key) |
| QHash<Key, T>::const_iterator | find(const Key &key) const |
| void | insert(const QHash<Key, T> &other) |
| QHash<Key, T>::iterator | insert(const Key &key, const T &value) |
(since 6.11) QHash<Key, T>::iterator | insert(Key &&key, T &&value) |
(since 6.11) QHash<Key, T>::iterator | insert(Key &&key, const T &value) |
(since 6.11) QHash<Key, T>::iterator | insert(const Key &key, T &&value) |
(since 6.9) QHash<Key, T>::TryEmplaceResult | insertOrAssign(K &&key, Value &&value) |
(since 6.9) QHash<Key, T>::TryEmplaceResult | insertOrAssign(Key &&key, Value &&value) |
(since 6.9) QHash<Key, T>::TryEmplaceResult | insertOrAssign(const Key &key, Value &&value) |
(since 6.9) std::pair<QHash<Key, T>::key_value_iterator, bool> | insert_or_assign(K &&key, Value &&value) |
(since 6.9) std::pair<QHash<Key, T>::key_value_iterator, bool> | insert_or_assign(Key &&key, Value &&value) |
(since 6.9) std::pair<QHash<Key, T>::key_value_iterator, bool> | insert_or_assign(const Key &key, Value &&value) |
(since 6.9) QHash<Key, T>::key_value_iterator | insert_or_assign(QHash<Key, T>::const_iterator hint, K &&key, Value &&value) |
(since 6.9) QHash<Key, T>::key_value_iterator | insert_or_assign(QHash<Key, T>::const_iterator hint, Key &&key, Value &&value) |
(since 6.9) QHash<Key, T>::key_value_iterator | insert_or_assign(QHash<Key, T>::const_iterator hint, const Key &key, Value &&value) |
| bool | isEmpty() const |
| Key | key(const T &value) const |
| Key | key(const T &value, const Key &defaultKey) const |
| QHash<Key, T>::key_iterator | keyBegin() const |
| QHash<Key, T>::key_iterator | keyEnd() const |
| QHash<Key, T>::key_value_iterator | keyValueBegin() |
| QHash<Key, T>::const_key_value_iterator | keyValueBegin() const |
| QHash<Key, T>::key_value_iterator | keyValueEnd() |
| QHash<Key, T>::const_key_value_iterator | keyValueEnd() const |
| QList<Key> | keys() const |
| QList<Key> | keys(const T &value) const |
| float | load_factor() const |
| bool | remove(const Key &key) |
(since 6.1) qsizetype | removeIf(Predicate pred) |
| void | reserve(qsizetype size) |
| qsizetype | size() const |
| void | squeeze() |
| void | swap(QHash<Key, T> &other) |
| T | take(const Key &key) |
(since 6.9) QHash<Key, T>::TryEmplaceResult | tryEmplace(K &&key, Args &&... args) |
(since 6.9) QHash<Key, T>::TryEmplaceResult | tryEmplace(Key &&key, Args &&... args) |
(since 6.9) QHash<Key, T>::TryEmplaceResult | tryEmplace(const Key &key, Args &&... args) |
(since 6.9) QHash<Key, T>::TryEmplaceResult | tryInsert(K &&key, const T &value) |
(since 6.9) QHash<Key, T>::TryEmplaceResult | tryInsert(const Key &key, const T &value) |
(since 6.9) std::pair<QHash<Key, T>::key_value_iterator, bool> | try_emplace(K &&key, Args &&... args) |
(since 6.9) std::pair<QHash<Key, T>::key_value_iterator, bool> | try_emplace(Key &&key, Args &&... args) |
(since 6.9) std::pair<QHash<Key, T>::key_value_iterator, bool> | try_emplace(const Key &key, Args &&... args) |
(since 6.9) QHash<Key, T>::key_value_iterator | try_emplace(QHash<Key, T>::const_iterator hint, K &&key, Args &&... args) |
(since 6.9) QHash<Key, T>::key_value_iterator | try_emplace(QHash<Key, T>::const_iterator hint, Key &&key, Args &&... args) |
(since 6.9) QHash<Key, T>::key_value_iterator | try_emplace(QHash<Key, T>::const_iterator hint, const Key &key, Args &&... args) |
| T | value(const Key &key) const |
| T | value(const Key &key, const T &defaultValue) const |
| QList<T> | values() const |
| QHash<Key, T> & | operator=(QHash<Key, T> &&other) |
| QHash<Key, T> & | operator=(const QHash<Key, T> &other) |
| T & | operator[](const Key &key) |
| const T | operator[](const Key &key) const |
関連する非メンバー
(since 6.1) qsizetype | erase_if(QHash<Key, T>&hash, Predicatepred) |
(since 6.5) size_t | qHash(Enumkey, size_tseed= 0) |
| size_t | qHash(const QStringRef&key, size_tseed= 0) |
| size_t | qHash(const QMqttTopicFilter&filter, size_tseed= 0) |
| size_t | qHash(const QSslKeyingMaterial&key) |
| size_t | qHash(const QGeoCoordinate&coordinate, size_tseed= 0) |
(since 6.0) size_t | qHash(QByteArrayViewkey, size_tseed= 0) |
| size_t | qHash(const QMqttTopicName&name, size_tseed= 0) |
| size_t | qHash(QSslEllipticCurvekey, size_tseed= 0) |
| size_t | qHash(ucharkey, size_tseed= 0) |
| size_t | qHash(uintkey, size_tseed= 0) |
| size_t | qHash(ulongkey, size_tseed= 0) |
| size_t | qHash(ushortkey, size_tseed= 0) |
(since 6.0) size_t | qHash(wchar_tkey, size_tseed= 0) |
| size_t | qHash(QDatekey, size_tseed= 0) |
| size_t | qHash(const QOcspResponse&key, size_tseed= 0) |
| size_t | qHash(QLatin1StringViewkey, size_tseed= 0) |
| size_t | qHash(const QSslCertificate&key, size_tseed= 0) |
(since 6.0) size_t | qHash(QPointkey, size_tseed= 0) |
| size_t | qHash(const QSslError&key, size_tseed= 0) |
| size_t | qHash(QTimekey, size_tseed= 0) |
| size_t | qHash(const QSslKeyingMaterial&key, size_tseed) |
(since 6.9) size_t | qHash(Tkey, size_tseed) |
| size_t | qHash(charkey, size_tseed= 0) |
(since 6.0) size_t | qHash(char16_tkey, size_tseed= 0) |
(since 6.0) size_t | qHash(char32_tkey, size_tseed= 0) |
(since 6.0) size_t | qHash(char8_tkey, size_tseed= 0) |
| size_t | qHash(const QBitArray&key, size_tseed= 0) |
| size_t | qHash(const QByteArray&key, size_tseed= 0) |
| size_t | qHash(const QCharkey, size_tseed= 0) |
| size_t | qHash(const QDateTime&key, size_tseed= 0) |
| size_t | qHash(const QHash<Key, T>&key, size_tseed= 0) |
| size_t | qHash(const QSet<T>&key, size_tseed= 0) |
| size_t | qHash(const QString&key, size_tseed= 0) |
(since 6.0) size_t | qHash(const QTypeRevision&key, size_tseed= 0) |
| size_t | qHash(const QUrl&key, size_tseed= 0) |
| size_t | qHash(const QVersionNumber&key, size_tseed= 0) |
| size_t | qHash(const T*key, size_tseed= 0) |
(since 6.12) size_t | qHash(const std::optional<T>&key, size_tseed= 0) |
| size_t | qHash(const std::pair<T1, T2>&key, size_tseed= 0) |
| size_t | qHash(doublekey, size_tseed= 0) |
| size_t | qHash(floatkey, size_tseed= 0) |
| size_t | qHash(intkey, size_tseed= 0) |
| size_t | qHash(longkey, size_tseed= 0) |
| size_t | qHash(long doublekey, size_tseed= 0) |
(since 6.8) size_t | qHash(qint128key, size_tseed= 0) |
| size_t | qHash(qint64key, size_tseed= 0) |
(since 6.8) size_t | qHash(quint128key, size_tseed= 0) |
| size_t | qHash(quint64key, size_tseed= 0) |
| size_t | qHash(shortkey, size_tseed= 0) |
| size_t | qHash(signed charkey, size_tseed= 0) |
(since 6.0) size_t | qHash(std::nullptr_tkey, size_tseed= 0) |
| size_t | qHashBits(const void*p, size_tlen, size_tseed= 0) |
(since 6.0) size_t | qHashMulti(size_tseed, const T &...args) |
(since 6.0) size_t | qHashMultiCommutative(size_tseed, const T &...args) |
| size_t | qHashRange(InputIteratorfirst, InputIteratorlast, size_tseed= 0) |
| size_t | qHashRangeCommutative(InputIteratorfirst, InputIteratorlast, size_tseed= 0) |
| bool | operator!=(const QHash<Key, T>&lhs, const QHash<Key, T>&rhs) |
| QDataStream & | operator<<(QDataStream&out, const QHash<Key, T>&hash) |
| bool | operator==(const QHash<Key, T>&lhs, const QHash<Key, T>&rhs) |
| QDataStream & | operator>>(QDataStream&in, QHash<Key, T>&hash) |
マクロ
(since 6.11) | QT_NO_SINGLE_ARGUMENT_QHASH_OVERLOAD |
詳細な説明
QHash<KEY, T> は Qtのジェネリックコンテナクラスの一つであり、Key は検索キーとして使用される型、T はマッピングされる値の型です。これは (キー, 値) のペアを格納し、キーに関連付けられた値の検索を非常に高速に行います。
QHashは、QMap と非常に似た機能を提供します。違いは以下の通りです:
- QHashはQMap よりも高速な検索を提供します。(詳細については「アルゴリズムの計算量」を参照してください。)
- QMap を反復処理する場合、項目は常にキー順にソートされます。QHash では、項目の順序は任意です。
- QMap のキー型はoperator<()を実装する必要があります。QHashのキー型はoperator==()と、qHash()と呼ばれるグローバルハッシュ関数を実装する必要があります(qHash を参照)。
以下に、QString をキーとし、int を値とするQHashの例を示します。
(キー, 値)のペアをハッシュに挿入するには、operator[]() を使用できます:
hash["one"] = 1;
hash["three"] = 3;
hash["seven"] = 7;これにより、QHashに次の3つの(key, value)ペアが挿入されます:("one", 1)、("three", 3)、および("seven", 7)。ハッシュに項目を挿入する別の方法として、insert()を使用する方法があります:
hash.insert("twelve", 12);値を検索するには、operator[]() またはvalue() を使用します:
int num1 = hash["thirteen"];
int num2 = hash.value("thirteen");ハッシュに指定されたキーを持つ項目がない場合、これらの関数はデフォルト構築された値を返します。
ハッシュに特定のキーが含まれているかどうかを確認したい場合は、contains() を使用します:
int timeout = 30;
if (hash.contains("TIMEOUT"))
timeout = hash.value("TIMEOUT");また、指定されたキーを持つ項目が存在しない場合に、第2引数をデフォルト値として使用するvalue()のオーバーロードも用意されています:
int timeout = hash.value("TIMEOUT", 30);一般的に、ハッシュ内でキーを検索する際には、operator[]() ではなくcontains() およびvalue() を使用することをお勧めします。その理由は、operator[]() では、同じキーを持つ項目が存在しない場合、ハッシュに項目が静かに挿入されてしまうためです(ハッシュが const でない限り)。 たとえば、次のコードスニペットを実行すると、メモリ上に 1000 個の項目が作成されます:
// WRONG
QHash<int, QWidget *> hash;
//...
for (int i = 0; i < 1000; ++i) {
if (hash[i] == okButton)
cout << "Found button at index " << i << endl;
}この問題を回避するには、上記のコードで `hash[i] ` を `hash.value(i) ` に置き換えてください。
内部的には、QHashはハッシュテーブルを使用して検索を実行します。このハッシュテーブルは、メモリを無駄に消費することなく高速な検索を実現するために自動的に拡張されます。QHashに含まれる項目の数がおおよそ分かっている場合は、reserve() を呼び出すことでハッシュテーブルのサイズを制御することもできますが、良好なパフォーマンスを得るためにこれは必須ではありません。 また、capacity() を呼び出すことで、ハッシュテーブルのサイズを取得することもできます。
QHashは、テーブルから項目が削除されても自動的に縮小することはありません。ハッシュが使用するメモリを最小限に抑えるには、squeeze() を呼び出してください。
QHashに格納されているすべての(キー, 値)のペアを反復処理するには、asKeyValueRange()を使用します:
for (const auto &[key, value] : std::as_const(hash).asKeyValueRange())
cout << qPrintable(key) << ": " << value << endl;この関数は、構造化バインディングで使用できる範囲オブジェクトを返します。イテレータを手動で制御するには、従来のSTLスタイルのイテレータ(QHash::const_iterator およびQHash::iterator )を使用することもできます:
for (auto it = hash.cbegin(); it != hash.cend(); ++it)
cout << qPrintable(it.key()) << ": " << it.value() << endl;値を変更するには、イテレータを使用します:
for (auto it = hash.begin(); it != hash.end(); ++it)
it.value() += 1;QHash は、互換性のためにJava スタイルのイテレータ(QHashIterator およびQMutableHashIterator )も提供しています。
QHash は順序付けられていないため、イテレータのシーケンスが予測可能であるとは限りません。キーによる順序付けが必要な場合は、QMap を使用してください。
QHash では、1 つのキーにつき 1 つの値しか保持できません。QHash にすでに存在するキーでinsert() を呼び出すと、以前の値は消去されます。例:
hash.insert("plenty", 100);
hash.insert("plenty", 2000);
// hash.value("plenty") == 2000ハッシュテーブルに同じキーに対して複数のエントリを格納する必要がある場合は、QMultiHash を使用してください。
ハッシュから値のみ(キーは不要)を取得する必要がある場合は、範囲指定の for 文を使用することもできます:
ハッシュから項目を削除するには、いくつかの方法があります。1つの方法は、remove() を呼び出すことです。これにより、指定されたキーを持つすべての項目が削除されます。もう1つの方法は、QMutableHashIterator::remove() を使用することです。さらに、clear() を使用してハッシュ全体をクリアすることもできます。
QHashのキーおよび値のデータ型は、代入可能なデータ型でなければなりません。たとえば、QWidget を値として格納することはできません。その代わりに、QWidget *を格納してください。
ハッシュ関数
QHashのキー型には、代入可能なデータ型であることに加えて、さらなる要件があります。すなわち、operator==() を提供している必要があり、また、キーの型である引数に対してハッシュ値を返すハッシュ関数が存在しなければなりません。
ハッシュ関数は、キーに基づいて数値を計算します。同じ引数が与えられた場合に常に同じ値を返す限り、どのようなアルゴリズムを使用してもかまいません。 言い換えれば、e1 == e2 ならば、hash(e1) == hash(e2) も成立しなければならない。ただし、良好なパフォーマンスを得るためには、ハッシュ関数は異なるキーに対して可能な限り異なるハッシュ値を返すよう努めるべきである。
キー型 `K ` に対するハッシュ関数は、2つの異なる方法で提供することができます。
1つ目の方法は、`K`の名前空間内で`qHash() `のオーバーロードを定義することです。関数`qHash() `は、以下のいずれかのシグネチャを持つ必要があります:
size_tqHash(K key,size_t seed);
size_t qHash(const K &key, size_t seed);
size_t qHash(K key); // deprecated, do not use
size_t qHash(const K &key); // deprecated, do not use2つの引数を取るオーバーロードは、ハッシュ関数の計算のシードとして使用される符号なし整数を受け取ります。このシードは、algorithmic complexity attacks の系列を回避するためにQHashによって提供されます。
注: Qt 6では 、引数を 1 つしか受け取らないqHash() のオーバーロードを定義することが可能ですが、この機能のサポートは非推奨となっています。Qt 7 以降では、2 引数のオーバーロードの使用が必須となります。 キー型に対して引数1つのオーバーロードと引数2つのオーバーロードの両方が定義されている場合、QHashでは後者が使用されます(引数2つのバージョンを定義し、シードパラメータにデフォルト値を使用することも可能です)。 Qt 6 では、QT_NO_SINGLE_ARGUMENT_QHASH_OVERLOAD マクロを定義することで、引数が 1 つの `qHash ` オーバーロードのサポートを無効にすることができます。
ハッシュ関数を指定する2つ目の方法は、キー型K に対してstd::hash クラスを特化させ、それに適切な関数呼び出し演算子を定義することです:
namespace std
{
template <> struct hash<K>
{
// seed is optional
size_t operator()(const K &key, size_t seed = 0) const;
};
}seed引数はqHash() の場合と同じ意味を持ち、省略することも可能です。
この2つ目の方法により、QHashとC++標準ライブラリの順序付けられていない連想コンテナの間で、同じハッシュ関数を再利用することが可能になります。ある型に対してqHash() のオーバーロードとstd::hash の特化の両方が提供されている場合、qHash() のオーバーロードが優先されます。
QHashのキーとして使用できるC++およびQtの型の一部を以下に示します:任意の整数型(char、unsigned longなど)、任意のポインタ型、QChar 、QString 、およびQByteArray 。これらすべてについて、<QHash> ヘッダーは、適切なハッシュ値を計算するqHash()関数を定義しています。 他にも多くのQtクラスが、その型に対するqHash のオーバーロードを宣言しています。各クラスのドキュメントを参照してください。
他の型をキーとして使用したい場合は、operator==() とハッシュの実装を必ず用意してください。
便利なqHashMulti()関数を使用すると、カスタム型に対してqHash()を実装できます。通常、この場合、複数のフィールドからハッシュ値を生成したいと考えられます。
例:
#ifndef EMPLOYEE_H
#define EMPLOYEE_H
class Employee
{
public:
Employee() {}
Employee(const QString &name, QDate dateOfBirth);
QString name() const { return myName; }
QDate dateOfBirth() const { return myDateOfBirth; }
//...
private:
QString myName;
QDate myDateOfBirth;
};
inline bool operator==(const Employee &e1, const Employee &e2)
{
return e1.name() == e2.name()
&& e1.dateOfBirth() == e2.dateOfBirth();
}
inline size_t qHash(const Employee &key, size_t seed)
{
return qHashMulti(seed, key.name(), key.dateOfBirth());
}
#endif // EMPLOYEE_H上記の例では、QString およびQDate に対して、Qt XML の独自のqHash() の実装を利用し、従業員の名前と生年月日にそれぞれ対応するハッシュ値を算出しています。
Qtが提供するqHash()のオーバーロードの実装は、いつでも変更される可能性があることに注意してください。異なるQtバージョン間で、qHash()が(同じ入力に対して)同じ結果を返すという事実に依存してはなりません。
アルゴリズムの計算量に基づく攻撃
すべてのハッシュテーブルは、特定の種類のサービス拒否(DoS)攻撃に対して脆弱です。この攻撃では、攻撃者が、ハッシュテーブルの同じバケットにハッシュされる(あるいはまったく同じハッシュ値を持つ)一連の異なるキーを慎重に事前に計算しておきます。 この攻撃は、データがテーブルに入力された際に、最悪ケースのアルゴリズム挙動(償却平均 O(1) ではなく O(n)、詳細については「アルゴリズムの計算量」を参照)を引き起こすことを目的としています。
この最悪ケースの挙動を回避するために、qHash() によるハッシュ値の計算にランダムなシードを適用することで、攻撃の影響を無効化することができます。 このシードは、QHash によってプロセスごとに 1 回自動的に生成され、その後、QHash によって `qHash()` 関数の 2 引数オーバーロードの 2 番目の引数として渡されます。
QHash のこのランダム化は、デフォルトで有効になっています。プログラムは特定の QHash の順序に依存してはなりませんが、デバッグや回帰テストなど、一時的に決定論的な挙動が必要になる状況があるかもしれません。ランダム化を無効にするには、環境変数 `QT_HASH_SEED ` の値を 0 に設定してください。あるいは、QHashSeed::setDeterministicGlobalSeed() 関数を呼び出すこともできます。
関連項目: QHashIterator 、QMutableHashIterator 、QMap 、およびQSet 。
メンバ型のドキュメント
QHash::ConstIterator
QHash::const_iterator の Qt スタイルの別名。
QHash::Iterator
QHash::iterator の Qt スタイルの同義語。
QHash::const_key_value_iterator
QHash::const_key_value_iterator の typedef は、QHash に対して STL スタイルの const イテレータを提供します。
QHash::const_key_value_iterator は、本質的にはQHash::const_iterator と同じですが、operator*() が値の代わりにキーと値のペアを返す点が異なります。
QKeyValueIteratorも参照してください 。
[alias] QHash::difference_type
ptrdiff_t の typedef。STL との互換性を確保するために用意されています。
[alias] QHash::key_type
Key の typedef。STL との互換性を確保するために用意されています。
QHash::key_value_iterator
QHash::key_value_iterator の typedef は、QHash 用の STL スタイルのイテレータを提供します。
QHash::key_value_iterator は、本質的にはQHash::iterator と同じですが、operator*() が値ではなくキーと値のペアを返す点が異なります。
QKeyValueIteratorも参照してください 。
[alias] QHash::mapped_type
T の typedef。STL との互換性を確保するために用意されています。
[alias] QHash::size_type
int の typedef。STL との互換性を確保するために用意されています。
メンバ関数のドキュメント
[noexcept default] QHash::QHash()
空のハッシュを生成します。
clear()も参照してください 。
QHash::QHash(std::initializer_list<std::pair<Key, T>> list)
初期化リストlist に含まれる各要素のコピーを用いて、ハッシュを構築します。
template <typename InputIterator> QHash::QHash(InputIterator begin, InputIterator end)
イテレータ範囲 [begin,end) 内の各要素のコピーを用いてハッシュを構築します。この場合、範囲によって反復処理される要素は、first およびsecond データメンバー(std::pair など)を持ち、それぞれKey およびT に変換可能なオブジェクトでなければならないか、あるいはイテレータがkey() およびvalue() メンバー関数を持ち、それぞれKey に変換可能なキーとT に変換可能な値を返すものでなければなりません。
[noexcept] QHash::QHash(const QHash<Key, T> &other)
other のコピーを作成します。
QHashは暗黙的に共有されているため、この操作は定数時間で実行されます。これにより、関数からQHashを返す処理が非常に高速になります。共有されたインスタンスが変更された場合、そのインスタンスはコピーされます(コピー・オン・ライト)が、これには線形時間がかかります。
operator=()も参照してください 。
[noexcept] QHash::QHash(QHash<Key, T> &&other)
QHashのインスタンスをムーブコンストラクタで生成し、other が指していたのと同じオブジェクトを指すようにします。
QHash::~QHash()
ハッシュを破棄します。ハッシュ内の値への参照およびこのハッシュのすべてのイテレータは無効になります。
[since 6.4] auto QHash::asKeyValueRange() &&
[since 6.4] auto QHash::asKeyValueRange() &
[since 6.4] auto QHash::asKeyValueRange() const &&
[since 6.4] auto QHash::asKeyValueRange() const &
このハッシュをキーと値のペアとして反復処理できる範囲オブジェクトを返します。たとえば、この範囲オブジェクトは、構造化バインディング宣言と組み合わせて、範囲ベースの for ループで使用できます。
QHash<QString, int> hash;
hash.insert("January", 1);
hash.insert("February", 2);
// ...
hash.insert("December", 12);
for (auto [key, value] : hash.asKeyValueRange()) {
cout << qPrintable(key) << ": " << value << endl;
--value; // convert to JS month indexing
}この方法で取得されるキーと値は、いずれもハッシュ内の要素への参照であることに注意してください。具体的には、値を変更するとハッシュ自体が変更されます。
警告: 返された イテレータや参照は、ハッシュに対して非const関数を次に呼び出したとき、またはハッシュが破棄された時点で無効化されたものとみなすべきです。
これらの関数は Qt 6.4 で導入されました。
QKeyValueIteratorも参照してください 。
QHash<Key, T>::iterator QHash::begin()
ハッシュの最初の要素を指すSTL形式のイテレータを返します。
警告: 返された イテレータや参照は、ハッシュに対して非const関数を次に呼び出したとき、またはハッシュが破棄された時点で無効化されたものとみなすべきです。
関連項目: constBegin() およびend()。
[noexcept] QHash<Key, T>::const_iterator QHash::begin() const
警告:返された イテレータや参照は、ハッシュに対して非const関数を次に呼び出したとき、またはハッシュが破棄された時点で無効化されたものとみなす必要があります。
これはオーバーロードされた関数です。
[noexcept] qsizetype QHash::capacity() const
QHash の内部ハッシュテーブルに含まれるバケットの数を返します。
この関数の唯一の目的は、QHash のメモリ使用量を微調整する手段を提供することです。通常、この関数を呼び出す必要はほとんどありません。ハッシュに含まれる項目の数を知りたい場合は、size()を呼び出してください。
reserve() およびsqueeze()も参照してください 。
[noexcept] QHash<Key, T>::const_iterator QHash::cbegin() const
ハッシュの最初の要素を指す、STL スタイルのconstイテレータを返します。
警告: 返された イテレータや参照は、ハッシュに対して非const関数を次に呼び出したとき、またはハッシュが破棄された時点で無効化されたものとみなすべきです。
[noexcept] QHash<Key, T>::const_iterator QHash::cend() const
ハッシュの最後の要素の後に存在する架空の要素を指す、STL スタイルのconstイテレータを返します。
警告: 返された イテレータや参照は、ハッシュに対して非const関数を次に呼び出したとき、またはハッシュが破棄された時点で無効化されたものとみなすべきです。
[noexcept(...)] void QHash::clear()
ハッシュからすべての項目を削除し、ハッシュが使用していたメモリをすべて解放します。
注: std::is_nothrow_destructible<Node>::value がtrue の場合、この関数はnoexceptとなります 。
remove()も参照してください 。
[noexcept] QHash<Key, T>::const_iterator QHash::constBegin() const
ハッシュの最初の要素を指す、STL スタイルのconstイテレータを返します。
警告: 返された イテレータや参照は、ハッシュに対して非const関数を次に呼び出したとき、またはハッシュが破棄された時点で無効化されたものとみなされるべきです。
begin() およびconstEnd()も参照してください 。
[noexcept] QHash<Key, T>::const_iterator QHash::constEnd() const
ハッシュの最後の項目の後に位置する架空の項目を指す、STL スタイルのconstイテレータを返します。
警告: 返された イテレータや参照は、ハッシュに対して非const関数を次に呼び出したとき、またはハッシュが破棄された時点で無効化されたものとみなすべきです。
constBegin() およびend()も参照してください 。
[noexcept] QHash<Key, T>::const_iterator QHash::constFind(const Key &key) const
ハッシュ内のkey を持つ項目を指すイテレータを返します。
ハッシュにkey を持つ項目が含まれていない場合、この関数はconstEnd()を返します。
警告: 返された イテレータや参照は、ハッシュに対して非 const 関数を次に呼び出したとき、またはハッシュが破棄されたときに無効になると見なされるべきです。
find()も参照してください 。
[noexcept] QHash<Key, T>::const_key_value_iterator QHash::constKeyValueBegin() const
ハッシュの最初のエントリを指す、STL スタイルのconstイテレータを返します。
警告: 返された イテレータや参照は、ハッシュに対して非const関数を次に呼び出したとき、またはハッシュが破棄された時点で無効化されたものとみなすべきです。
keyValueBegin()も参照してください 。
[noexcept] QHash<Key, T>::const_key_value_iterator QHash::constKeyValueEnd() const
ハッシュの最後のエントリの直後に位置する仮想のエントリを指す、STL スタイルのconstイテレータを返します。
警告: 返された イテレータや参照は、ハッシュに対して非const関数を次に呼び出したとき、またはハッシュが破棄されたときに、無効化されたものとみなされるべきです。
constKeyValueBegin()も参照してください 。
[noexcept] bool QHash::contains(const Key &key) const
ハッシュに `key` を持つ項目が含まれている場合は `true ` を返し、そうでない場合は `false` を返します。
count()も参照してください 。
[noexcept] qsizetype QHash::count(const Key &key) const
key に関連付けられた項目の数を返します。
「contains()」も参照してください 。
[noexcept] qsizetype QHash::count() const
size() と同じです。
これはオーバーロードされた関数です。
template <typename... Args> QHash<Key, T>::iterator QHash::emplace(Key &&key, Args &&... args)
template <typename... Args> QHash<Key, T>::iterator QHash::emplace(const Key &key, Args &&... args)
コンテナに新しい要素を挿入します。この新しい要素は、args を構築引数として使用して、その場(インプレース)で構築されます。コンテナにその要素がすでに存在する場合、その要素は置き換えられます。
新しい要素を指すイテレータを返します。
警告:返された イテレータや参照は、ハッシュに対して非const関数を次に呼び出したとき、またはハッシュが破棄された時点で無効化されたものとみなす必要があります。
[noexcept] bool QHash::empty() const
この関数は、STLとの互換性を確保するために提供されています。これはisEmpty()と同等であり、ハッシュが空の場合はtrueを返し、そうでない場合はfalse を返します。
[noexcept] QHash<Key, T>::iterator QHash::end()
ハッシュの最後の項目の後に位置する架空の項目を指す、STL スタイルのイテレータを返します。
警告:返された イテレータや参照は、ハッシュに対して非const関数を次に呼び出したとき、またはハッシュが破棄された時点で無効化されたものとみなすべきです。
begin() およびconstEnd()も参照してください 。
[noexcept] QHash<Key, T>::const_iterator QHash::end() const
警告:返された イテレータや参照は、ハッシュに対して非const関数を次に呼び出したとき、またはハッシュが破棄された時点で無効化されたものとみなされるべきです。
これはオーバーロードされた関数です。
QHash<Key, T>::iterator QHash::erase(QHash<Key, T>::const_iterator pos)
イテレータ `pos ` に関連付けられた (キー, 値) のペアをハッシュから削除し、ハッシュ内の次の項目へのイテレータを返します。
この関数は、QHash の内部データ構造の再ハッシュ処理を引き起こすことはありません。つまり、反復処理中に安全に呼び出すことができ、ハッシュ内の項目の順序に影響を与えません。例:
QHash<QObject *, int> objectHash;
//...
QHash<QObject *, int>::iterator i = objectHash.find(obj);
while (i != objectHash.end() && i.key() == obj) {
if (i.value() == 0) {
i = objectHash.erase(i);
} else {
++i;
}
}警告:返された イテレータや参照は、ハッシュに対して非const関数を次に呼び出したとき、またはハッシュが破棄された時点で無効化されたものとみなすべきです。
remove()、take()、およびfind()も参照してください 。
QHash<Key, T>::iterator QHash::find(const Key &key)
ハッシュ内のkey を持つ項目を指すイテレータを返します。
ハッシュにkey を持つ項目が含まれていない場合、この関数はend()を返します。
ハッシュにkey を持つ項目が複数存在する場合、この関数は最も新しく挿入された値を指すイテレータを返します。他の値には、イテレータをインクリメントすることでアクセスできます。例えば、同じキーを持つすべての項目を反復処理するコードは次のようになります:
QHash<QString, int> hash;
//...
QHash<QString, int>::const_iterator i = hash.find("HDR");
while (i != hash.end() && i.key() == "HDR") {
cout << i.value() << endl;
++i;
}警告: 返された イテレータや参照は、ハッシュに対して非const関数を次に呼び出したとき、またはハッシュが破棄された時点で無効化されたものとみなすべきです。
value() およびvalues()も参照してください 。
[noexcept] QHash<Key, T>::const_iterator QHash::find(const Key &key) const
警告:返された イテレータや参照は、ハッシュに対して非const関数を次に呼び出したとき、またはハッシュが破棄された時点で無効化されたものとみなすべきです。
これはオーバーロードされた関数です。
void QHash::insert(const QHash<Key, T> &other)
other ハッシュ内のすべての項目を、このハッシュに挿入します。
両方のハッシュに共通するキーがある場合、その値はother に格納されている値に置き換えられます。
QHash<Key, T>::iterator QHash::insert(const Key &key, const T &value)
key というキーと、値value を持つ新しい項目を挿入します。
key というキーを持つ項目がすでに存在する場合、その項目の値はvalue に置き換えられます。
既存のキーを持つキー/値のペアを挿入すると、既存の値が置き換えられます。
新しい要素または更新された要素を指すイテレータを返します。
警告: 返された イテレータや参照は、ハッシュに対して非 const 関数を次に呼び出したとき、またはハッシュが破棄されたときに無効化されたものとみなすべきです。
[since 6.11] QHash<Key, T>::iterator QHash::insert(Key &&key, T &&value)
[since 6.11] QHash<Key, T>::iterator QHash::insert(Key &&key, const T &value)
[since 6.11] QHash<Key, T>::iterator QHash::insert(const Key &key, T &&value)
これらの機能は、Qt 6.11で導入されました。
[since 6.9] template <typename K, typename Value> requires if_heterogeneously_searchable<K> && if_key_constructible_from<K> QHash<Key, T>::TryEmplaceResult QHash::insertOrAssign(K &&key, Value &&value)
[since 6.9] template <typename Value> QHash<Key, T>::TryEmplaceResult QHash::insertOrAssign(Key &&key, Value &&value)
[since 6.9] template <typename Value> QHash<Key, T>::TryEmplaceResult QHash::insertOrAssign(const Key &key, Value &&value)
key およびvalue を使用してアイテムを挿入しようとします。key を持つアイテムがすでに存在する場合、その値はvalue で上書きされます。
TryEmplaceResult のインスタンスを返します。これは、アイテムへのiterator と、アイテムが新規に作成されたか(true )、または以前に存在していたか(false )を示すブール値inserted を保持する構造体です。
これらの関数は Qt 6.9 で導入されました。
insert()、tryEmplace()、およびtryInsert()も参照してください 。
[since 6.9] template <typename K, typename Value> requires if_heterogeneously_searchable<K> && if_key_constructible_from<K> std::pair<QHash<Key, T>::key_value_iterator, bool> QHash::insert_or_assign(K &&key, Value &&value)
[since 6.9] template <typename Value> std::pair<QHash<Key, T>::key_value_iterator, bool> QHash::insert_or_assign(Key &&key, Value &&value)
[since 6.9] template <typename Value> std::pair<QHash<Key, T>::key_value_iterator, bool> QHash::insert_or_assign(const Key &key, Value &&value)
key およびvalue を使用して、項目の挿入を試みます。key を持つ項目がすでに存在する場合、その値はvalue で上書きされます。
その項目を指すイテレータと、その項目が新規に作成されたか(true )、あるいは以前から存在していたか(false )を示すブール値からなるペアを返します。
これらの関数は、標準ライブラリとの互換性を確保するために提供されています。
これらの関数は Qt 6.9 で導入されました。
insert()、tryEmplace()、tryInsert()、およびinsertOrAssign()も参照してください 。
[since 6.9] template <typename K, typename Value> requires if_heterogeneously_searchable<K> && if_key_constructible_from<K> QHash<Key, T>::key_value_iterator QHash::insert_or_assign(QHash<Key, T>::const_iterator hint, K &&key, Value &&value)
[since 6.9] template <typename Value> QHash<Key, T>::key_value_iterator QHash::insert_or_assign(QHash<Key, T>::const_iterator hint, Key &&key, Value &&value)
[since 6.9] template <typename Value> QHash<Key, T>::key_value_iterator QHash::insert_or_assign(QHash<Key, T>::const_iterator hint, const Key &key, Value &&value)
key およびvalue を使用してアイテムを挿入しようとします。key を持つアイテムがすでに存在する場合、その値はvalue で上書きされます。
その項目を指すイテレータと、その項目が新しく作成されたか(true )、あるいは以前から存在していたか(false )を示すブール値からなるタプルを返します。
hint は無視されます。
これらの関数は、標準ライブラリとの互換性のために提供されています。
これらの関数は、Qt 6.9 で導入されました。
insert()、tryEmplace()、およびinsertOrAssign()も参照してください 。
[noexcept] bool QHash::isEmpty() const
ハッシュに要素が含まれていない場合は `true ` を返し、それ以外の場合は `false` を返します。
size()も参照してください 。
[noexcept] Key QHash::key(const T &value) const
[noexcept] Key QHash::key(const T &value, const Key &defaultKey) const
value にマッピングされた最初のキーを返します。ハッシュにvalue にマッピングされた項目が含まれていない場合は、defaultKey を返します。また、このパラメータが指定されていない場合は、デフォルトで構築されたキーを返します。
QHash の内部データ構造は、値による検索ではなくキーによる高速な検索のために最適化されているため、この関数の実行は遅くなる可能性があります(線形時間)。
[noexcept] QHash<Key, T>::key_iterator QHash::keyBegin() const
ハッシュ内の最初のキーを指す、STL スタイルのconstイテレータを返します。
警告: 返された イテレータや参照は、ハッシュに対して非const関数を次に呼び出したとき、またはハッシュが破棄された時点で無効化されたものとみなすべきです。
keyEnd()も参照してください 。
[noexcept] QHash<Key, T>::key_iterator QHash::keyEnd() const
ハッシュの最後のキーの後に存在する架空の項目を指す、STL スタイルのconstイテレータを返します。
警告: 返された イテレータや参照は、ハッシュに対して非const関数を次に呼び出したとき、またはハッシュが破棄された時点で無効化されたものとみなされるべきです。
keyBegin()も参照してください 。
QHash<Key, T>::key_value_iterator QHash::keyValueBegin()
ハッシュの最初のエントリを指すSTL形式のイテレータを返します。
警告: 返された イテレータや参照は、ハッシュに対して非const関数を次に呼び出したとき、またはハッシュが破棄された時点で無効化されたものとみなすべきです。
keyValueEnd()も参照してください 。
[noexcept] QHash<Key, T>::const_key_value_iterator QHash::keyValueBegin() const
ハッシュの最初のエントリを指す、STL スタイルのconstイテレータを返します。
警告: 返された イテレータや参照は、ハッシュに対して非const関数が次に呼び出されたとき、またはハッシュが破棄された時点で無効化されたものとみなすべきです。
keyValueEnd()も参照してください 。
QHash<Key, T>::key_value_iterator QHash::keyValueEnd()
ハッシュの最後のエントリの直後に位置する仮想のエントリを指す、STLスタイルのイテレータを返します。
警告: 返された イテレータや参照は、ハッシュに対して非const関数を次に呼び出したとき、またはハッシュが破棄された時点で無効化されたものとみなすべきです。
keyValueBegin()も参照してください 。
[noexcept] QHash<Key, T>::const_key_value_iterator QHash::keyValueEnd() const
ハッシュの最後のエントリの直後に位置する仮想のエントリを指す、STL スタイルのconstイテレータを返します。
警告: 返された イテレータや参照は、ハッシュに対して非const関数が次に呼び出されたとき、またはハッシュが破棄されたときに無効化されたものとみなすべきです。
keyValueBegin()も参照してください 。
QList<Key> QHash::keys() const
ハッシュ内のすべてのキーを、任意の順序で含むリストを返します。
順序は、values() で使用される順序と同じであることが保証されています。
この関数は、線形時間で新しいリストを作成します。これに伴う時間およびメモリの使用は、keyBegin() からkeyEnd() へイテレーションを行うことで回避できます。
QList<Key> QHash::keys(const T &value) const
値 `value` に関連付けられたすべてのキーを、任意の順序で含むリストを返します。
QHash の内部データ構造は、値ではなくキーによる高速な検索用に最適化されているため、この関数の実行速度は遅くなる可能性があります(線形時間)。
これはオーバーロードされた関数です。
[noexcept] float QHash::load_factor() const
QHash の内部ハッシュテーブルの現在の負荷率を返します。これは、capacity() およびsize() と同じ動作をします。実装では、負荷率を0.25から0.5の間に維持するよう努めます。これにより、パフォーマンスを低下させるようなハッシュテーブルの衝突が過度に発生することを防ぎます。
ロードファクタが低くても、ハッシュテーブルの実装によるメモリオーバーヘッドは極めて小さいです。
このメソッドは純粋に診断目的で存在しており、自分で呼び出す必要はほとんどないはずです。
reserve() およびsqueeze()も参照してください 。
bool QHash::remove(const Key &key)
ハッシュから、key を持つ項目を削除します。ハッシュにそのキーが存在し、項目が削除された場合は true を返し、そうでない場合は false を返します。
[since 6.1] template <typename Predicate> qsizetype QHash::removeIf(Predicate pred)
述語 `pred ` が真を返すすべての要素をハッシュから削除します。
この関数は、QHash<Key, T>::iterator 型の引数、またはstd::pair<const Key &, T &> 型の引数を受け取る述語をサポートしています。
削除された要素がある場合は、その数を返します。
この関数は Qt 6.1 で導入されました。
void QHash::reserve(qsizetype size)
QHash の内部ハッシュテーブルが、ハッシュテーブルを拡張することなく、少なくともsize 個の項目を格納できる空き容量を確保します。
これは、良好なパフォーマンスを確保するために、ハッシュテーブルには少なくとも 2 *size 個のバケットが含まれることを意味します。
この関数は、巨大なハッシュを構築する必要があり、繰り返し再割り当てを避けたいコードに有用です。例えば:
QHash<QString, int> hash;
hash.reserve(20000);
for (int i = 0; i < 20000; ++i)
hash.insert(keys[i], values[i]);理想的には、size はハッシュ内に予想されるアイテムの最大数であるべきです。そうすれば、QHash は、内部ハッシュテーブルを拡張することなく、size 個のアイテムをテーブルに格納できる最小限のバケット数を選択します。もしsize が過小評価されていたとしても、最悪の場合、QHash の動作がわずかに遅くなるだけです。
一般的に、この関数を呼び出す必要が生じることはほとんどありません。QHash の内部ハッシュテーブルは、メモリを無駄に消費することなく良好なパフォーマンスを確保できるよう、自動的に拡張されます。
squeeze() およびcapacity()も参照してください 。
[noexcept] qsizetype QHash::size() const
ハッシュに含まれる要素の数を返します。
isEmpty() およびcount()も参照してください 。
void QHash::squeeze()
QHash の内部ハッシュテーブルのサイズを縮小し、メモリを節約します。
この関数の唯一の目的は、QHash のメモリ使用量を微調整する手段を提供することです。一般的に、この関数を呼び出す必要が生じることはほとんどありません。
reserve() およびcapacity()も参照してください 。
[noexcept] void QHash::swap(QHash<Key, T> &other)
このハッシュをother と入れ替えます。この操作は非常に高速で、失敗することはありません。
T QHash::take(const Key &key)
key を持つ項目をハッシュから削除し、それに関連付けられた値を返します。
ハッシュにその項目が存在しない場合、この関数はデフォルト構築された値を単に返します。
戻り値を使用しない場合は、remove() の方が効率的です。
remove()も参照してください 。
[since 6.9] template <typename K, typename... Args> requires if_heterogeneously_searchable<K> && if_key_constructible_from<K> QHash<Key, T>::TryEmplaceResult QHash::tryEmplace(K &&key, Args &&... args)
[since 6.9] template <typename... Args> QHash<Key, T>::TryEmplaceResult QHash::tryEmplace(Key &&key, Args &&... args)
[since 6.9] template <typename... Args> QHash<Key, T>::TryEmplaceResult QHash::tryEmplace(const Key &key, Args &&... args)
key およびargs から構築された値を持つ新しい項目を挿入します。key を持つ項目がすでに存在する場合、挿入は行われません。
TryEmplaceResult のインスタンスを返します。これは、新しく作成された項目、または挿入を妨げた既存の項目へのiterator と、挿入が行われたかどうかを示すブール値inserted を保持する構造体です。
たとえば、これを使用することで、新旧のサイズを比較する処理や二重ルックアップといったパターンを回避できます。以前は次のようなコードを書いていたかもしれません:
QHash<int, MyType> hash;
// [...]
int myKey = getKey();
qsizetype oldSize = hash.size();
MyType &elem = hash[myKey];
if (oldSize != hash.size()) // Size changed: new element!
initialize(elem);
// [use elem...]代わりに次のように記述できます:
QHash<int, MyType> hash;
// [...]
int myKey = getKey();
auto result = hash.tryEmplace(myKey);
if (result.inserted) // New element!
initialize(*result.iterator);
// [use result.iterator...]これらの関数は Qt 6.9 で導入されました。
emplace()、tryInsert()、およびinsertOrAssign()も参照してください 。
[since 6.9] template <typename K> requires if_heterogeneously_searchable<K> && if_key_constructible_from<K> QHash<Key, T>::TryEmplaceResult QHash::tryInsert(K &&key, const T &value)
[since 6.9] QHash<Key, T>::TryEmplaceResult QHash::tryInsert(const Key &key, const T &value)
key を持ち、値がvalue である新しい項目を挿入します。key を持つ項目がすでに存在する場合、挿入は行われません。
TryEmplaceResult のインスタンスを返します。この構造体には、新しく作成された項目、または挿入を阻止した既存の項目へのiterator 、および挿入が行われたかどうかを示すブール値inserted が格納されています。
これらの関数は Qt 6.9 で導入されました。
insert()、tryEmplace()、およびinsertOrAssign()も参照してください 。
[since 6.9] template <typename K, typename... Args> requires if_heterogeneously_searchable<K> && if_key_constructible_from<K> std::pair<QHash<Key, T>::key_value_iterator, bool> QHash::try_emplace(K &&key, Args &&... args)
[since 6.9] template <typename... Args> std::pair<QHash<Key, T>::key_value_iterator, bool> QHash::try_emplace(Key &&key, Args &&... args)
[since 6.9] template <typename... Args> std::pair<QHash<Key, T>::key_value_iterator, bool> QHash::try_emplace(const Key &key, Args &&... args)
key を持つ新しい項目を、args から構築された値とともに挿入します。key を持つ項目がすでに存在する場合、挿入は行われません。
挿入された項目(または挿入を妨げた項目)へのイテレータと、挿入が行われたかどうかを示すブール値からなるペアを返します。
これらの関数は、標準ライブラリとの互換性を確保するために提供されています。
これらの関数は Qt 6.9 で導入されました。
emplace()、tryEmplace()、tryInsert()、およびinsertOrAssign()も参照してください 。
[since 6.9] template <typename K, typename... Args> requires if_heterogeneously_searchable<K> && if_key_constructible_from<K> QHash<Key, T>::key_value_iterator QHash::try_emplace(QHash<Key, T>::const_iterator hint, K &&key, Args &&... args)
[since 6.9] template <typename... Args> QHash<Key, T>::key_value_iterator QHash::try_emplace(QHash<Key, T>::const_iterator hint, Key &&key, Args &&... args)
[since 6.9] template <typename... Args> QHash<Key, T>::key_value_iterator QHash::try_emplace(QHash<Key, T>::const_iterator hint, const Key &key, Args &&... args)
key を持つ新しい項目を、args から生成された値とともに挿入します。key を持つ項目がすでに存在する場合、挿入は行われません。
挿入された項目のイテレータ、または挿入を妨げた項目へのイテレータを返します。
hint は無視されます。
これらの関数は、標準ライブラリとの互換性のために提供されています。
これらの関数は、Qt 6.9 で導入されました。
emplace()、tryEmplace()、tryInsert()、およびinsertOrAssign()も参照してください 。
[noexcept] T QHash::value(const Key &key) const
[noexcept] T QHash::value(const Key &key, const T &defaultValue) const
key に関連付けられた値を返します。
ハッシュにkey を持つ項目が含まれていない場合、この関数はdefaultValue を返します。また、このパラメータが指定されていない場合は、デフォルト構築された値を返します。
QList<T> QHash::values() const
ハッシュ内のすべての値を、任意の順序で含むリストを返します。
順序は、keys() で使用される順序と同じであることが保証されています。
この関数は、線形時間で新しいリストを作成します。これに伴う時間とメモリの使用は、keyValueBegin() からkeyValueEnd() へ反復処理を行うことで回避できます。
[noexcept] QHash<Key, T> &QHash::operator=(QHash<Key, T> &&other)
other をこのQHash インスタンスに割り当てます。
[noexcept] QHash<Key, T> &QHash::operator=(const QHash<Key, T> &other)
このハッシュに `other ` を割り当て、このハッシュへの参照を返します。
T &QHash::operator[](const Key &key)
key に関連付けられた値を、変更可能な参照として返します。
ハッシュにkey を持つ項目が含まれていない場合、この関数はkeyを持つデフォルト構築された値をハッシュに挿入し、その参照を返します。
警告: 返された イテレータや参照は、ハッシュに対して非 const 関数を次に呼び出したとき、またはハッシュが破棄されたときに無効化されたものとみなすべきです。
insert() およびvalue()も参照してください 。
[noexcept] const T QHash::operator[](const Key &key) const
value() と同じです。
これはオーバーロードされた関数です。
関連する非メンバー変数
[since 6.1] template <
typename Key,
typename T,
typename Predicate
>
qsizetype erase_if(QHash<Key, T> &hash, Predicate pred)
ハッシュ `hash` から、述語 `pred ` が真を返すすべての要素を削除します。
この関数は、QHash<Key, T>::iterator 型の引数、またはstd::pair<const Key &, T &> 型の引数を受け取る述語をサポートしています。
削除された要素がある場合は、その数を返します。
この関数は Qt 6.1 で導入されました。
[constexpr noexcept, since 6.5] template <typename Enum, std::enable_if_t<std::is_enum_v<Enum>, bool> = true> size_t qHash(Enum key, size_t seed = 0)
key のハッシュ値を返します。計算のシードにはseed が使用されます。
注: Qt 6.5以前では 、スコープのない列挙型は、その基底となる整数型への暗黙の変換が行われるため、この関数の整数オーバーロードに依存していました。スコープのある列挙型の場合、ユーザー自身がオーバーロードを実装する必要がありました。これは、古い Qt バージョンとの互換性を維持するための、後方互換性を保った修正です。
この関数は Qt 6.5 で導入されました。
[noexcept, since 6.0] size_t qHash(QByteArrayView key, size_t seed = 0)
key のハッシュ値を返します。計算のシードにはseed を使用します。
この関数は Qt 6.0 で導入されました。
[constexpr noexcept] size_t qHash(uchar key, size_t seed = 0)
`key` のハッシュ値を、計算のシードとして `seed ` を使用して返します。
[constexpr noexcept] size_t qHash(uint key, size_t seed = 0)
`key` のハッシュ値を、計算のシードとして `seed ` を使用して返します。
[constexpr noexcept] size_t qHash(ulong key, size_t seed = 0)
`key` のハッシュ値を、計算のシードとして `seed ` を使用して返します。
[constexpr noexcept] size_t qHash(ushort key, size_t seed = 0)
`key` のハッシュ値を返します。計算のシードには `seed ` を使用します。
[constexpr noexcept, since 6.0] size_t qHash(wchar_t key, size_t seed = 0)
key のハッシュ値を返します。計算のシードにはseed を使用します。
この関数は Qt 6.0 で導入されました。
[noexcept] size_t qHash(QDate key, size_t seed = 0)
`key` のハッシュ値を、`seed ` を計算のシードとして使用して返します。
[noexcept] size_t qHash(QLatin1StringView key, size_t seed = 0)
`key` のハッシュ値を返します。計算のシードには `seed ` を使用します。
[noexcept, since 6.0] size_t qHash(QPoint key, size_t seed = 0)
key のハッシュ値を返します。計算のシードにはseed を使用します。
この関数は Qt 6.0 で導入されました。
[noexcept] size_t qHash(QTime key, size_t seed = 0)
`key` のハッシュ値を返します。計算のシードには `seed ` を使用します。
[constexpr noexcept, since 6.9] template <typename T, std::enable_if_t<std::is_same_v<T, bool>, bool>> size_t qHash(T key, size_t seed)
key のハッシュ値を返し、計算のシードとしてseed を使用します。
注:これは qHash(bool) であり、単に bool に変換される型の引数ではなく、bool 型の引数のみを受け入れるように制限されています。
注: Qt 6.9 以前のバージョンでは 、このオーバーロードは、文書化されていない 1 引数から 2 引数への qHash アダプタテンプレート関数によって意図せず提供されており、動作は同一でした。
この関数は Qt 6.9 で導入されました。
[constexpr noexcept] size_t qHash(char key, size_t seed = 0)
`key` のハッシュ値を返します。計算のシードには `seed ` を使用します。
[constexpr noexcept, since 6.0] size_t qHash(char16_t key, size_t seed = 0)
key のハッシュ値を、seed を計算のシードとして使用して返します。
この関数は Qt 6.0 で導入されました。
[constexpr noexcept, since 6.0] size_t qHash(char32_t key, size_t seed = 0)
key のハッシュ値を返します。計算のシード値としてseed を使用します。
この関数は Qt 6.0 で導入されました。
[constexpr noexcept, since 6.0] size_t qHash(char8_t key, size_t seed = 0)
key のハッシュ値を返します。計算のシードには `seed ` を使用します。
この関数は Qt 6.0 で導入されました。
[noexcept] size_t qHash(const QBitArray &key, size_t seed = 0)
`key` のハッシュ値を返します。計算のシードには `seed ` を使用します。
[noexcept] size_t qHash(const QByteArray &key, size_t seed = 0)
`key` のハッシュ値を返し、計算のシードとして `seed ` を使用します。
[constexpr noexcept] size_t qHash(const QChar key, size_t seed = 0)
`key` のハッシュ値を、計算のシードとして `seed ` を使用して返します。
size_t qHash(const QDateTime &key, size_t seed = 0)
`key` のハッシュ値を、計算のシードとして `seed ` を使用して返します。
[noexcept(...)] template <typename Key, typename T> size_t qHash(const QHash<Key, T> &key, size_t seed = 0)
seed を計算のシードとして使用し、key のハッシュ値を返します。
Key およびT の型は、qHash() でサポートされている必要があります。
注: noexcept(qHash(std::declval<Key&>())) && noexcept(qHash(std::declval<T&>())) がtrue の場合、この関数は noexcept です。
[noexcept(...)] template <typename T> size_t qHash(const QSet<T> &key, size_t seed = 0)
seed を計算のシードとして使用し、key のハッシュ値を返します。
T の型は、qHash() によってサポートされている必要があります。
ハッシュ値は、key 内の要素の順序に依存しません。つまり、同じ要素を含む集合は、同じハッシュ値になります。
注: noexcept(qHashRangeCommutative(key.begin(), key.end(), seed)) がtrue の場合、この関数は noexcept です。
[noexcept] size_t qHash(const QString &key, size_t seed = 0)
`key` のハッシュ値を、`seed ` を計算のシードとして使用して返します。
[since 6.0] size_t qHash(const QTypeRevision &key, size_t seed = 0)
key のハッシュ値を返します。計算のシードにはseed を使用します。
この関数は Qt 6.0 で導入されました。
[noexcept] size_t qHash(const QUrl &key, size_t seed = 0)
`key` のハッシュ値を、`seed ` を計算のシードとして使用して返します。
size_t qHash(const QVersionNumber &key, size_t seed = 0)
`key` のハッシュ値を返します。計算のシードには `seed ` を使用します。
[noexcept] template <typename T> size_t qHash(const T *key, size_t seed = 0)
`key` のハッシュ値を、計算のシードとして `seed ` を使用して返します。
[constexpr noexcept(...), since 6.12] template <typename T> size_t qHash(const std::optional<T> &key, size_t seed = 0)
seed を計算のシードとして使用し、key のハッシュ値を返します。
T 型は、qHash() によってサポートされている必要があります。
これは、以下と同等です。
具体的には、key が有効になっている場合(has_value() )、key のハッシュ値はkey.value() のハッシュ値と同じであることが保証され、無効になっている(!has_value() )すべてのオプション(型を問わず)は、同じ値にハッシュされます。
この関数は Qt 6.12 で導入されました。
注: QHashPrivate::noexceptPairHash<T, T>() がtrue の場合、この関数はnoexceptとなります 。
qHash (std::nullopt_t, size_t)も参照してください 。
[noexcept(...)] template <typename T1, typename T2> size_t qHash(const std::pair<T1, T2> &key, size_t seed = 0)
key のハッシュ値を、seed を計算のシードとして使用して返します。
T1 およびT2 の型は、qHash() によってサポートされている必要があります。
注: QHashPrivate::noexceptPairHash<T1, T2>() がtrue の場合、この関数は noexcept です。
[noexcept] size_t qHash(double key, size_t seed = 0)
`key` のハッシュ値を返します。計算のシードには `seed ` を使用します。
[noexcept] size_t qHash(float key, size_t seed = 0)
`key` のハッシュ値を、`seed ` を計算のシードとして使用して返します。
[constexpr noexcept] size_t qHash(int key, size_t seed = 0)
`key` のハッシュ値を、計算のシードとして `seed ` を使用して返します。
[constexpr noexcept] size_t qHash(long key, size_t seed = 0)
`key` のハッシュ値を、計算のシードとして `seed ` を使用して返します。
[noexcept] size_t qHash(long double key, size_t seed = 0)
`key` のハッシュ値を返します。計算のシードには `seed ` を使用します。
[constexpr noexcept, since 6.8] size_t qHash(qint128 key, size_t seed = 0)
`key` のハッシュ値を返します。計算のシードには `seed ` を使用します。
注:この関数は 、ネイティブの128ビット整数型をサポートしているプラットフォームでのみ利用可能です。
この関数は Qt 6.8 で導入されました。
[constexpr noexcept] size_t qHash(qint64 key, size_t seed = 0)
`key` のハッシュ値を、計算のシードとして `seed ` を使用して返します。
[constexpr noexcept, since 6.8] size_t qHash(quint128 key, size_t seed = 0)
`key` のハッシュ値を、`seed ` を計算のシードとして使用して返します。
注:この関数は 、ネイティブの 128 ビット整数型をサポートするプラットフォームでのみ利用可能です。
この関数は Qt 6.8 で導入されました。
[constexpr noexcept] size_t qHash(quint64 key, size_t seed = 0)
`key` のハッシュ値を、計算のシードとして `seed ` を使用して返します。
[constexpr noexcept] size_t qHash(short key, size_t seed = 0)
`key` のハッシュ値を、計算のシードとして `seed ` を使用して返します。
[constexpr noexcept] size_t qHash(signed char key, size_t seed = 0)
`key` のハッシュ値を、計算のシードとして `seed ` を使用して返します。
[constexpr noexcept, since 6.0] size_t qHash(std::nullptr_t key, size_t seed = 0)
key のハッシュ値を返します。計算のシードにはseed を使用します。
この関数は Qt 6.0 で導入されました。
[noexcept] size_t qHashBits(const void *p, size_t len, size_t seed = 0)
p が指す、サイズがlen のメモリブロックのハッシュ値を、seed を計算のシードとして使用して返します。
この関数は、独自のカスタム型に対してqHash()を実装する場合にのみ使用してください。例えば、std::vector<int>のqHash()のオーバーロードを次のように実装できます:
inline size_t qHash(const std::vector<int> &key, size_t seed = 0)
{
if (key.empty())
return seed;
else
return qHashBits(&key.front(), key.size() * sizeof(int), seed);
}これは、std::vector がデータを連続した領域に配置しているという事実を利用しています。そうでない場合、または含まれる型にパディングがある場合は、代わりにqHashRange() を使用する必要があります。
Qtが提供するqHash()のオーバーロードと同様に、qHashBits()の実装はいつでも変更される可能性があることを改めて強調しておきます。異なるQtバージョン間で、qHashBits()が(同じ入力に対して)同じ結果を返すという事実に依存してはなりません。
qHashRange() およびqHashRangeCommutative()も参照してください 。
[constexpr noexcept(...), since 6.0] template <typename... T> size_t qHashMulti(size_t seed, const T &... args)
args のハッシュ値を返します。計算のシードとしてseed を使用し、各要素に対してqHash()を順次適用し、ハッシュ値を1つの値に統合します。
引数の順序が重要であることに注意してください。順序が重要でない場合は、代わりに `qHashMultiCommutative()` を使用してください。生のメモリをハッシュ化する場合は `qHashBits()` を、範囲をハッシュ化する場合は `qHashRange()` を使用してください。
この関数は、独自のカスタム型に対して `qHash()` を実装するための便宜として提供されています。例えば、クラス `Employee` に対して `qHash()` のオーバーロードを実装する方法は次のようになります。
#ifndef EMPLOYEE_H
#define EMPLOYEE_H
class Employee
{
public:
Employee() {}
Employee(const QString &name, QDate dateOfBirth);
QString name() const { return myName; }
QDate dateOfBirth() const { return myDateOfBirth; }
//...
private:
QString myName;
QDate myDateOfBirth;
};
inline bool operator==(const Employee &e1, const Employee &e2)
{
return e1.name() == e2.name()
&& e1.dateOfBirth() == e2.dateOfBirth();
}
inline size_t qHash(const Employee &key, size_t seed)
{
return qHashMulti(seed, key.name(), key.dateOfBirth());
}
#endif // EMPLOYEE_Hこの関数は Qt 6.0 で導入されました。
注: std::conjunction_v<QtPrivate::QNothrowHashable<T>...> がtrue の場合、この関数は noexcept となります。
「 qHashMultiCommutative 」および「qHashRange 」も参照してください 。
[constexpr noexcept(...), since 6.0] template <typename... T> size_t qHashMultiCommutative(size_t seed, const T &... args)
args のハッシュ値を返します。計算のシードにはseed を使用し、各要素に対してqHash()を順次適用し、ハッシュ値を1つに統合します。
引数の順序は重要ではありません。順序が重要な場合は、より高品質なハッシュが生成される可能性があるため、代わりに `qHashMulti()` を使用してください。生のメモリをハッシュ化する場合は `qHashBits()` を、範囲をハッシュ化する場合は `qHashRange()` を使用してください。
この関数は、独自のカスタム型に対して `qHash()` を実装するための便宜として提供されています。
この関数は Qt 6.0 で導入されました。
注: std::conjunction_v<QtPrivate::QNothrowHashable<T>...> がtrue の場合、この関数は noexcept です。
「 qHashMulti 」および「qHashRange 」も参照してください 。
[noexcept(...)] template <typename InputIterator> size_t qHashRange(InputIterator first, InputIterator last, size_t seed = 0)
範囲 [first,last) に対するハッシュ値を返します。計算のシード値として `seed ` を使用し、各要素に対して `qHash()` を順次適用し、ハッシュ値を1つに統合します。
この関数の戻り値は、範囲内の要素の順序に依存します。つまり、
{0, 1, 2}および
{1, 2, 0}異なる値にハッシュ化されます。順序が重要でない場合(ハッシュテーブルなど)、代わりにqHashRangeCommutative() を使用してください。生のメモリをハッシュ化する場合は、qHashBits() を使用してください。
この関数は、独自のカスタム型に対してqHash()を実装する場合にのみ使用してください。例えば、std::vector<int>に対してqHash()のオーバーロードを実装する方法は以下の通りです:
inline size_t qHash(const std::vector<int> &key, size_t seed = 0)
{
return qHashRange(key.begin(), key.end(), seed);
}Qtが提供するqHash()のオーバーロードと同様に、qHashRange()の実装はいつでも変更される可能性があることを改めて強調しておきます。たとえ要素型に対するqHash()が同じ結果を出力したとしても、異なるQtバージョン間でqHashRange()が(同じ入力に対して)同じ結果を返すという事実に依存してはなりません。
注: noexcept(qHash(*first, 0)) がtrue である場合、この関数はnoexceptとなります 。
関連項目: qHashBits() およびqHashRangeCommutative()。
[noexcept(...)] template <typename InputIterator> size_t qHashRangeCommutative(InputIterator first, InputIterator last, size_t seed = 0)
範囲 [first,last) に対するハッシュ値を返します。計算のシードにはseed を使用し、各要素に対してqHash() を順次適用し、ハッシュ値を1つに統合します。
この関数の戻り値は、範囲内の要素の順序に依存しません。つまり、
{0, 1, 2}および
{1, 2, 0}は同じ値にハッシュ化されます。順序が重要な場合(例えば、ベクトルや配列など)は、代わりに `qHashRange()` を使用してください。生のメモリをハッシュ化する場合は、`qHashBits()` を使用してください。
この関数は、独自のカスタム型に対してqHash()を実装する場合にのみ使用してください。例えば、std::unordered_set<int>用のqHash()のオーバーロードを次のように実装できます:
inline size_t qHash(const std::unordered_set<int> &key, size_t seed = 0)
{
return qHashRangeCommutative(key.begin(), key.end(), seed);
}qHashRangeCommutative() の実装は、Qt が提供するqHash() のオーバーロードと同様に、いつでも変更される可能性があることを改めて強調しておきます。 たとえ要素型に対するqHash()が同じ結果を返すとしても、qHashRangeCommutative()が異なるQtバージョン間で(同じ入力に対して)同じ結果を返すという事実に依存してはなりません。
注: noexcept(qHash(*first, 0)) がtrue の場合、この関数は noexcept となります。
関連項目: qHashBits() およびqHashRange()。
[noexcept] bool operator!=(const QHash<Key, T> &lhs, const QHash<Key, T> &rhs)
lhs のハッシュとrhs のハッシュが等しくない場合はtrue を返し、等しい場合はfalse を返します。
2つのハッシュは、同じ (キー, 値) ペアを含んでいる場合に等しいとみなされます。
この関数を使用するには、値型が `operator==()` を実装している必要があります。
operator==()も参照してください 。
template <typename Key, typename T> QDataStream &operator<<(QDataStream &out, const QHash<Key, T> &hash)
ハッシュ `hash ` をストリーム `out` に書き込みます。
この関数を使用するには、キーと値の型が `operator<<()` を実装している必要があります。
「Qt データ型のシリアライズ」も参照してください 。
[noexcept] bool operator==(const QHash<Key, T> &lhs, const QHash<Key, T> &rhs)
lhs のハッシュがrhs のハッシュと等しい場合は `true ` を返し、そうでない場合は `false` を返します。
2つのハッシュは、同じ (キー, 値) のペアを含んでいる場合に等しいとみなされます。
この関数では、値型が `operator==()` を実装している必要があります。
operator!=()も参照してください 。
template <typename Key, typename T> QDataStream &operator>>(QDataStream &in, QHash<Key, T> &hash)
ストリーム `in ` からハッシュを読み取り、`hash` に格納します。
この関数を使用するには、キーおよび値の型がoperator>>() を実装している必要があります。
「Qt データ型のシリアライズ」も参照してください 。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.