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, Predicate pred) |
(since 6.5) size_t | qHash(Enum key, size_t seed = 0) |
| size_t | qHash(const QStringRef&key, size_t seed = 0) |
| size_t | qHash(const QMqttTopicFilter&filter, size_t seed = 0) |
| size_t | qHash(const QSslKeyingMaterial&key) |
| size_t | qHash(const QGeoCoordinate&coordinate, size_t seed = 0) |
(since 6.0) size_t | qHash(QByteArrayView key, size_t seed = 0) |
| size_t | qHash(const QMqttTopicName&name, size_t seed = 0) |
| size_t | qHash(QSslEllipticCurve key, size_t seed = 0) |
| size_t | qHash(uchar key, size_t seed = 0) |
| size_t | qHash(uint key, size_t seed = 0) |
| size_t | qHash(ulong key, size_t seed = 0) |
| size_t | qHash(ushort key, size_t seed = 0) |
(since 6.0) size_t | qHash(wchar_t key, size_t seed = 0) |
| size_t | qHash(QDate key, size_t seed = 0) |
| size_t | qHash(const QOcspResponse&key, size_t seed = 0) |
| size_t | qHash(QLatin1StringView key, size_t seed = 0) |
| size_t | qHash(const QSslCertificate&key, size_t seed = 0) |
(since 6.0) size_t | qHash(QPoint key, size_t seed = 0) |
| size_t | qHash(const QSslError&key, size_t seed = 0) |
| size_t | qHash(QTime key, size_t seed = 0) |
| size_t | qHash(const QSslKeyingMaterial&key, size_t seed) |
(since 6.9) size_t | qHash(T key, size_t seed) |
| size_t | qHash(char key, size_t seed = 0) |
(since 6.0) size_t | qHash(char16_t key, size_t seed = 0) |
(since 6.0) size_t | qHash(char32_t key, size_t seed = 0) |
(since 6.0) size_t | qHash(char8_t key, size_t seed = 0) |
| size_t | qHash(const QBitArray&key, size_t seed = 0) |
| size_t | qHash(const QByteArray&key, size_t seed = 0) |
| size_t | qHash(const QChar key, size_t seed = 0) |
| size_t | qHash(const QDateTime&key, size_t seed = 0) |
| size_t | qHash(const QHash<Key, T>&key, size_t seed = 0) |
| size_t | qHash(const QSet<T>&key, size_t seed = 0) |
| size_t | qHash(const QString&key, size_t seed = 0) |
(since 6.0) size_t | qHash(const QTypeRevision&key, size_t seed = 0) |
| size_t | qHash(const QUrl&key, size_t seed = 0) |
| size_t | qHash(const QVersionNumber&key, size_t seed = 0) |
| size_t | qHash(const T*key, size_t seed = 0) |
(since 6.12) size_t | qHash(const std::optional<T>&key, size_t seed = 0) |
| size_t | qHash(const std::pair<T1, T2>&key, size_t seed = 0) |
| size_t | qHash(double key, size_t seed = 0) |
| size_t | qHash(float key, size_t seed = 0) |
| size_t | qHash(int key, size_t seed = 0) |
| size_t | qHash(long key, size_t seed = 0) |
| size_t | qHash(long double key, size_t seed = 0) |
(since 6.8) size_t | qHash(qint128 key, size_t seed = 0) |
| size_t | qHash(qint64 key, size_t seed = 0) |
(since 6.8) size_t | qHash(quint128 key, size_t seed = 0) |
| size_t | qHash(quint64 key, size_t seed = 0) |
| size_t | qHash(short key, size_t seed = 0) |
| size_t | qHash(signed char key, size_t seed = 0) |
(since 6.0) size_t | qHash(std::nullptr_t key, size_t seed = 0) |
| size_t | qHashBits(const void*p, size_t len, size_t seed = 0) |
(since 6.0) size_t | qHashMulti(size_t seed, const T &... args) |
(since 6.0) size_t | qHashMultiCommutative(size_t seed, const T &... args) |
| size_t | qHashRange(InputIterator first, InputIterator last, size_t seed = 0) |
| size_t | qHashRangeCommutative(InputIterator first, InputIterator last, size_t seed = 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;이렇게 하면 (“one”, 1), (“three”, 3), (“seven”, 7)이라는 세 개의 (키, 값) 쌍이 QHash에 삽입됩니다. 해시에 항목을 삽입하는 또 다른 방법은 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");또한, 지정된 키를 가진 항목이 없을 경우 두 번째 인자를 기본값으로 사용하는 ` 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는 키당 하나의 값만 허용합니다. QHash에 이미 존재하는 키로 insert()를 호출하면, 이전 값은 삭제됩니다. 예를 들어:
hash.insert("plenty", 100);
hash.insert("plenty", 2000);
// hash.value("plenty") == 2000해시 테이블에 동일한 키에 대해 여러 항목을 저장해야 하는 경우, ` QMultiHash`를 사용하십시오.
해시에서 키가 아닌 값만 추출해야 하는 경우, 범위 기반 for 문을 사용할 수도 있습니다:
해시에서 항목을 제거하는 방법에는 여러 가지가 있습니다. 한 가지 방법은 ` remove()`를 호출하는 것으로, 이렇게 하면 지정된 키를 가진 모든 항목이 제거됩니다. 또 다른 방법은 ` QMutableHashIterator::remove()`를 사용하는 것입니다. 또한 ` clear()`를 사용하여 해시 전체를 비울 수도 있습니다.
QHash의 키와 값 데이터 유형은 할당이 가능한 데이터 유형이어야 합니다. 예를 들어, QWidget 를 값으로 저장할 수는 없으며, 대신 QWidget *를 저장해야 합니다.
해싱 함수
QHash의 키 유형은 할당 가능한 데이터 유형이어야 한다는 것 외에도 추가적인 요구 사항이 있습니다. 즉, operator==()를 제공해야 하며, 키 유형의 인자에 대해 해시 값을 반환하는 해싱 함수가 있어야 합니다.
해싱 함수는 키를 기반으로 수치 값을 계산합니다. 동일한 인수가 주어졌을 때 항상 동일한 값을 반환하기만 한다면, 상상할 수 있는 어떤 알고리즘이든 사용할 수 있습니다. 즉, ` e1 == e2`일 때 ` hash(e1) == hash(e2) `도 성립해야 합니다. 그러나 우수한 성능을 얻기 위해서는 해싱 함수가 서로 다른 키에 대해 가능한 한 서로 다른 해시 값을 반환하도록 해야 합니다.
K 유형의 키에 대한 해싱 함수는 두 가지 다른 방식으로 제공될 수 있습니다.
첫 번째 방법은 ` K` 네임스페이스 내에서 ` qHash() `의 오버로드를 정의하는 것입니다. ` qHash() ` 함수는 다음 시그니처 중 하나를 가져야 합니다:
size_t qHash(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 use두 개의 인자를 받는 오버로드 함수는 해시 함수 계산의 시드(seed)로 사용될 부호 없는 정수를 받습니다. 이 시드는 QHash에서 제공하며, algorithmic complexity attacks 의 일련을 방지하기 위한 것입니다.
참고: Qt6에서는 인수를 하나만 받는 qHash() 오버로드를 정의할 수 있지만, 이에 대한 지원은 더 이상 권장되지 않습니다. Qt 7부터는 2개 인자 오버로드를 반드시 사용해야 합니다. 키 유형에 대해 단일 인자와 두 인자 오버로드가 모두 정의된 경우, QHash는 후자를 사용합니다(단순히 두 인자 버전을 정의하고 시드 매개변수에 기본값을 사용할 수 있다는 점에 유의하십시오). Qt 6에서는 QT_NO_SINGLE_ARGUMENT_QHASH_OVERLOAD 매크로를 정의하여 단일 인자 qHash 오버로드를 비활성화할 수 있습니다.
해싱 함수를 제공하는 두 번째 방법은 키 유형 K 에 대해 std::hash 클래스를 특화시키고, 이에 적합한 함수 호출 연산자를 제공하는 것입니다:
namespace std
{
template <> struct hash<K>
{
// seed is optional
size_t operator()(const K &key, size_t seed = 0) const;
};
}시드 인수는 qHash() 에서와 동일한 의미를 가지며, 생략할 수도 있습니다.
이 두 번째 방법을 사용하면 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위의 예제에서는 Qt가 제공하는 ` qHash()` 구현을 활용하여 ` QString ` 및 ` QDate `을 통해 각각 직원의 이름과 생년월일에 대한 해시 값을 산출했습니다.
Qt에서 제공하는 qHash() 오버로드의 구현은 언제든지 변경될 수 있다는 점에 유의하십시오. 서로 다른 Qt 버전에서 qHash()가 (동일한 입력에 대해) 동일한 결과를 반환할 것이라고 가정해서는 안 됩니다.
알고리즘 복잡도 공격
모든 해시 테이블은 특정 유형의 서비스 거부(DoS) 공격에 취약합니다. 이 공격에서 공격자는 해시 테이블의 동일한 버킷에 매핑되거나(심지어 정확히 동일한 해시 값을 가지는) 다양한 키 집합을 사전에 신중하게 계산해 둡니다. 이 공격은 데이터가 테이블에 입력될 때 최악의 경우 알고리즘 동작(상각된 O(1) 대신 O(n), 자세한 내용은 알고리즘 복잡도 참조)을 유발하는 것을 목표로 합니다.
이러한 최악의 경우 동작을 방지하기 위해, ` qHash()` 함수가 수행하는 해시 값 계산에 무작위 시드를 적용하여 공격의 영향을 무력화할 수 있습니다. 이 시드는 QHash에 의해 프로세스당 한 번씩 자동으로 생성되며, 이후 QHash에 의해 ` qHash()` 함수의 두 인자 오버로드 중 두 번째 인자로 전달됩니다.
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를 반환하는 작업이 매우 빠르게 이루어집니다. 공유된 인스턴스가 수정되면 복사(copy-on-write)되며, 이 과정에는 선형 시간이 소요됩니다.
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
}이 방법으로 얻은 키와 값은 모두 해시 내의 항목에 대한 참조라는 점에 유의하십시오. 특히, 값을 변경하면 해시 자체가 수정됩니다.
경고: 반환된 반복자/참조는 해시에 대해 non-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
해시의 첫 번째 항목을 가리키는 const STL 스타일의 이터레이터를 반환합니다.
경고: 반환된 이터레이터/참조는 해시에 대해 비const 함수를 다음에 호출하거나 해시가 소멸될 때 무효화된 것으로 간주해야 합니다.
[noexcept] QHash<Key, T>::const_iterator QHash::cend() const
해시의 마지막 항목 다음에 있는 가상의 항목을 가리키는 const STL 스타일의 이터레이터를 반환합니다.
경고: 반환된 이터레이터/참조는 해시에 대해 비const 함수를 다음에 호출할 때나 해시가 소멸될 때 무효화된 것으로 간주되어야 합니다.
[noexcept(...)] void QHash::clear()
해시에서 모든 항목을 제거하고, 해시가 사용하던 모든 메모리를 해제합니다.
참고: ` std::is_nothrow_destructible<Node>::value `가 ` true`인 경우,이 함수는 `noexcept`입니다.
remove()도 참조하십시오 .
[noexcept] QHash<Key, T>::const_iterator QHash::constBegin() const
해시의 첫 번째 항목을 가리키는 const STL 스타일의 이터레이터를 반환합니다.
경고: 반환된 이터레이터/참조는 해시에 대해 비const 함수를 다음에 호출할 때나 해시가 소멸될 때 무효화된 것으로 간주되어야 합니다.
begin() 및 constEnd()도 참조하십시오 .
[noexcept] QHash<Key, T>::const_iterator QHash::constEnd() const
해시의 마지막 항목 다음에 있는 가상의 항목을 가리키는 const STL 스타일의 이터레이터를 반환합니다.
경고: 반환된 이터레이터/참조는 해시에 대해 비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
해시의 마지막 항목 다음에 있는 가상의 항목을 가리키는 const STL 스타일의 이터레이터를 반환합니다.
경고: 반환된 이터레이터/참조는 해시에 대해 비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 스타일의 이터레이터를 반환합니다.
경고: 반환된 이터레이터/참조는 해시에 대해 non-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 함수를 다음에 호출할 때나 해시가 소멸될 때 무효화된 것으로 간주되어야 합니다.
[noexcept] QHash<Key, T>::const_iterator QHash::find(const Key &key) const
경고: 반환된 이터레이터/참조는 해시에 대해 non-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
해시의 첫 번째 키를 가리키는 const STL 스타일의 이터레이터를 반환합니다.
경고: 반환된 이터레이터/참조는 해시에 대해 비const 함수를 다음에 호출할 때나 해시가 소멸될 때 무효화된 것으로 간주되어야 합니다.
keyEnd()도 참조하십시오 .
[noexcept] QHash<Key, T>::key_iterator QHash::keyEnd() const
해시 내 마지막 키 다음에 있는 가상의 항목을 가리키는 const STL 스타일 이터레이터를 반환합니다.
경고: 반환된 이터레이터/참조는 해시에 대해 비const 함수를 다음에 호출할 때나 해시가 소멸될 때 무효화된 것으로 간주되어야 합니다.
keyBegin()도 참조하십시오 .
QHash<Key, T>::key_value_iterator QHash::keyValueBegin()
해시의 첫 번째 항목을 가리키는 STL 스타일의 이터레이터를 반환합니다.
경고: 반환된 이터레이터/참조는 해시에 대해 비const 함수를 다음에 호출할 때나 해시가 소멸될 때 무효화된 것으로 간주되어야 합니다.
keyValueEnd()도 참조하십시오 .
[noexcept] QHash<Key, T>::const_key_value_iterator QHash::keyValueBegin() const
해시의 첫 번째 항목을 가리키는 const STL 스타일의 이터레이터를 반환합니다.
경고: 반환된 이터레이터/참조는 해시에 대해 const가 아닌 함수를 다음에 호출할 때나 해시가 소멸될 때 무효화된 것으로 간주되어야 합니다.
keyValueEnd()도 참조하십시오 .
QHash<Key, T>::key_value_iterator QHash::keyValueEnd()
해시의 마지막 항목 바로 뒤에 있는 가상의 항목을 가리키는 STL 스타일의 이터레이터를 반환합니다.
경고: 반환된 이터레이터/참조는 해시에 대해 non-const 함수를 다음에 호출할 때나 해시가 소멸될 때 무효화된 것으로 간주되어야 합니다.
keyValueBegin()도 참조하십시오 .
[noexcept] QHash<Key, T>::const_key_value_iterator QHash::keyValueEnd() const
해시의 마지막 항목 다음에 있는 가상의 항목을 가리키는 const STL 스타일의 이터레이터를 반환합니다.
경고: 반환된 이터레이터/참조는 해시에 대해 비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
해시에 포함된 항목의 개수를 반환합니다.
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 를 포함합니다.
예를 들어, 이 함수를 사용하면 기존 크기와 새 크기를 비교하거나 이중 조회(double-lookup)가 발생하는 패턴을 피할 수 있습니다. 이전에는 다음과 같은 코드를 작성했을 수 있습니다:
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 을 가진 항목이 이미 존재하는 경우, 삽입은 수행되지 않습니다.
삽입된 항목(또는 삽입을 막은 항목)에 대한 이터레이터와 삽입이 성공했는지 여부를 나타내는 bool 값으로 구성된 튜플을 반환합니다.
이 함수들은 표준 라이브러리와의 호환성을 위해 제공됩니다.
이 함수들은 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 함수를 다음에 호출할 때나 해시가 소멸될 때 무효화된 것으로 간주되어야 합니다.
[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)
pred 조건식이 참을 반환하는 모든 요소를 해시 hash 에서 제거합니다.
이 함수는 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)
seed 를 계산의 시드로 사용하여 key 의 해시 값을 반환합니다.
이 함수는 Qt 6.0에서 도입되었습니다.
[constexpr noexcept] size_t qHash(uchar key, size_t seed = 0)
seed 를 계산의 시드로 사용하여 key 에 대한 해시 값을 반환합니다.
[constexpr noexcept] size_t qHash(uint key, size_t seed = 0)
seed 를 계산의 시드로 사용하여 key 에 대한 해시 값을 반환합니다.
[constexpr noexcept] size_t qHash(ulong key, size_t seed = 0)
seed 를 계산의 시드로 사용하여 key 에 대한 해시 값을 반환합니다.
[constexpr noexcept] size_t qHash(ushort key, size_t seed = 0)
seed 를 시드로 사용하여 key 의 해시 값을 반환합니다.
[constexpr noexcept, since 6.0] size_t qHash(wchar_t key, size_t seed = 0)
seed 를 계산의 시드로 사용하여 key 의 해시 값을 반환합니다.
이 함수는 Qt 6.0에서 도입되었습니다.
[noexcept] size_t qHash(QDate key, size_t seed = 0)
seed 를 계산의 시드로 사용하여 key 에 대한 해시 값을 반환합니다.
[noexcept] size_t qHash(QLatin1StringView key, size_t seed = 0)
seed 를 시드 값으로 사용하여 key 의 해시 값을 반환합니다.
[noexcept, since 6.0] size_t qHash(QPoint key, size_t seed = 0)
seed 를 계산의 시드로 사용하여 key 의 해시 값을 반환합니다.
이 함수는 Qt 6.0에서 도입되었습니다.
[noexcept] size_t qHash(QTime key, size_t seed = 0)
seed 를 계산의 시드로 사용하여 key 에 대한 해시 값을 반환합니다.
[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-to-2-arg qHash 어댑터 템플릿 함수를 통해 의도치 않게 이 오버로드가 제공되었으며, 동작은 동일했습니다.
이 함수는 Qt 6.9에서 도입되었습니다.
[constexpr noexcept] size_t qHash(char key, size_t seed = 0)
seed 를 계산의 시드로 사용하여, key 의 해시 값을 반환합니다.
[constexpr noexcept, since 6.0] size_t qHash(char16_t key, size_t seed = 0)
seed 를 계산의 시드로 사용하여 key 의 해시 값을 반환합니다.
이 함수는 Qt 6.0에서 도입되었습니다.
[constexpr noexcept, since 6.0] size_t qHash(char32_t key, size_t seed = 0)
seed 를 계산의 시드로 사용하여 key 의 해시 값을 반환합니다.
이 함수는 Qt 6.0에서 도입되었습니다.
[constexpr noexcept, since 6.0] size_t qHash(char8_t key, size_t seed = 0)
seed 를 계산의 시드로 사용하여 key 에 대한 해시 값을 반환합니다.
이 함수는 Qt 6.0에서 도입되었습니다.
[noexcept] size_t qHash(const QBitArray &key, size_t seed = 0)
seed 를 계산의 시드로 사용하여 key 에 대한 해시 값을 반환합니다.
[noexcept] size_t qHash(const QByteArray &key, size_t seed = 0)
seed 를 계산의 시드로 사용하여 key 에 대한 해시 값을 반환합니다.
[constexpr noexcept] size_t qHash(const QChar key, size_t seed = 0)
seed 를 계산의 시드로 사용하여 key 의 해시 값을 반환합니다.
size_t qHash(const QDateTime &key, size_t seed = 0)
seed 를 계산의 시드로 사용하여 key 에 대한 해시 값을 반환합니다.
[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)
seed 를 계산의 시드로 사용하여 key 에 대한 해시 값을 반환합니다.
[since 6.0] size_t qHash(const QTypeRevision &key, size_t seed = 0)
seed 을 시드로 사용하여 key 의 해시 값을 반환합니다.
이 함수는 Qt 6.0에서 도입되었습니다.
[noexcept] size_t qHash(const QUrl &key, size_t seed = 0)
seed 을 시드로 사용하여 key 의 해시 값을 반환합니다.
size_t qHash(const QVersionNumber &key, size_t seed = 0)
seed 를 계산의 시드로 사용하여 key 에 대한 해시 값을 반환합니다.
[noexcept] template <typename T> size_t qHash(const T *key, size_t seed = 0)
seed 를 계산의 시드로 사용하여 key 에 대한 해시 값을 반환합니다.
[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)
seed 를 계산의 시드로 사용하여 key 에 대한 해시 값을 반환합니다.
T1 및 T2 유형은 qHash()에서 지원되어야 합니다.
참고: QHashPrivate::noexceptPairHash<T1, T2>() 가 true 일 때,이 함수는 noexcept입니다.
[noexcept] size_t qHash(double key, size_t seed = 0)
seed 를 계산의 시드로 사용하여 key 에 대한 해시 값을 반환합니다.
[noexcept] size_t qHash(float key, size_t seed = 0)
seed 를 계산의 시드로 사용하여 key 에 대한 해시 값을 반환합니다.
[constexpr noexcept] size_t qHash(int key, size_t seed = 0)
seed 를 시드로 사용하여 key 의 해시 값을 반환합니다.
[constexpr noexcept] size_t qHash(long key, size_t seed = 0)
seed 를 계산의 시드로 사용하여, key 에 대한 해시 값을 반환합니다.
[noexcept] size_t qHash(long double key, size_t seed = 0)
seed 를 계산의 시드로 사용하여 key 의 해시 값을 반환합니다.
[constexpr noexcept, since 6.8] size_t qHash(qint128 key, size_t seed = 0)
seed 를 계산의 시드로 사용하여 key 의 해시 값을 반환합니다.
참고: 이 함수는 네이티브 128비트 정수형을 지원하는 플랫폼에서만 사용할 수 있습니다.
이 함수는 Qt 6.8에서 도입되었습니다.
[constexpr noexcept] size_t qHash(qint64 key, size_t seed = 0)
seed 를 계산의 시드로 사용하여 key 에 대한 해시 값을 반환합니다.
[constexpr noexcept, since 6.8] size_t qHash(quint128 key, size_t seed = 0)
seed 를 시드로 사용하여 key 의 해시 값을 반환합니다.
참고: 이 함수는 네이티브 128비트 정수형을 지원하는 플랫폼에서만 사용할 수 있습니다.
이 함수는 Qt 6.8에서 도입되었습니다.
[constexpr noexcept] size_t qHash(quint64 key, size_t seed = 0)
seed 를 계산의 시드로 사용하여 key 의 해시 값을 반환합니다.
[constexpr noexcept] size_t qHash(short key, size_t seed = 0)
seed 를 계산의 시드로 사용하여 key 에 대한 해시 값을 반환합니다.
[constexpr noexcept] size_t qHash(signed char key, size_t seed = 0)
seed 를 계산의 시드로 사용하여 key 에 대한 해시 값을 반환합니다.
[constexpr noexcept, since 6.0] size_t qHash(std::nullptr_t key, size_t seed = 0)
seed 를 계산의 시드로 사용하여 key 의 해시 값을 반환합니다.
이 함수는 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()`를 차례로 적용하고 해시 값들을 하나의 값으로 결합합니다.
인수의 순서가 중요하다는 점에 유의하십시오. 순서가 중요하지 않다면 대신 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()`를 차례로 적용한 뒤 해시 값들을 하나로 합칩니다.
인수의 순서는 중요하지 않습니다. 순서가 중요한 경우, 더 나은 품질의 해싱 결과를 얻을 수 있으므로 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()를 순차적으로 적용한 뒤, 그 해시 값들을 하나의 값으로 결합합니다.
이 함수의 반환 값은 범위 내 요소들의 순서에 따라 달라집니다. 즉,
{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()이 동일한 결과를 반환한다고 하더라도, qHashRange()가 서로 다른 Qt 버전에서 (동일한 입력에 대해) 동일한 결과를 반환할 것이라고 가정해서는 안 됩니다.
참고: 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()를 차례로 적용한 후 해시 값들을 하나의 값으로 결합합니다.
이 함수의 반환값은 범위 내 요소들의 순서에 영향을 받지 않습니다. 즉,
{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);
}Qt에서 제공하는 qHash() 오버로드와 마찬가지로, qHashRangeCommutative()의 구현은 언제든지 변경될 수 있다는 점을 다시 한번 강조합니다. 해당 요소 유형에 대한 ` 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 를 반환합니다.
두 해시가 동일한 (키, 값) 쌍을 포함하고 있으면 서로 같다고 간주됩니다.
이 함수를 사용하려면 값 유형이 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 를 반환합니다.
두 해시가 동일한 (키, 값) 쌍을 포함하고 있으면 서로 같다고 간주됩니다.
이 함수를 사용하려면 값 유형이 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.