qhash 예제

사용자 지정 형식에 대해 qHash()를 구현하는 경우에만 이 함수를 사용합니다. 예를 들어 std::vector: 해시를 다른 값에 대한 해시에 대해 qHash() 오버로드를 구현하는 방법은 다음과 같습니다. 예를 들어 해시 테이블과 같은 순서가 중요하지 않은 경우 qHashRangeCommutative()를 대신 사용합니다. 원시 메모리를 해시하는 경우 qHashBits()를 사용합니다. QStack 및 QQueue 편의 하위 클래스의 두 가지 예입니다. QStack 푸시(), 팝(), top()을 제공하는 벡터입니다. QQueue enqueue(), dequeue() 및 head()를 제공하는 목록입니다. 해시에 키가 있는 여러 항목이 포함된 경우 이 함수는 가장 최근에 삽입된 값을 가리키는 이터레이터를 반환합니다. 다른 값은 이터레이터를 증분하여 액세스할 수 있습니다. 예를 들어, 동일한 키를 가진 모든 항목에 대해 반복하는 몇 가지 코드는 다음과 같습니다: remove() 및 take(와 달리))) 이 함수는 QHash가 내부 데이터 구조를 다시 해시하지 않습니다. 즉, 반복하는 동안 안전하게 호출할 수 있으며 해시의 항목 순서에 영향을 주지 않습니다. 예: 몇 가지 Qt 함수가 컨테이너를 반환합니다.

STL 스타일 반복기를 사용하여 함수의 반환 값을 반복하려면 컨테이너의 복사본을 가져 와서 복사본을 반복해야 합니다. 예를 들어 다음 코드는 QSplitter::sizes()에서 반환하는 QList 를 반복하는 올바른 방법입니다. 이 예제로 작업할 때 나는 이것이 나에게 오류를 던지는 이유를 이해합니다. 나는 뭔가를 누락 할 수 있지만,이 배울 저를 안내하시기 바랍니다. 일반적으로 QHash는 키당 하나의 값만 허용합니다. QHash에 이미 있는 키를 가진 insert()를 호출하면 이전 값이 지워집니다. 예: Simon이 주석에서 지적했듯이 이 버전은 원래 버전보다 효율이 낮습니다. 역할 이름이 있는 해시 맵은 함수 roleName이 호출될 때마다 만들어집니다. 이 문제는 쉽게 해결할 수 있습니다. 원래 예제에서와 같이 정적 const 변수 역할을 선언하고 해시 맵으로 초기화하고 역할을 반환할 수 있습니다. 암시적 공유는 백그라운드에서 자동으로 작동하므로 이 최적화를 위해 코드에서 아무 작업도 수행할 필요가 없습니다.

그러나 일이 어떻게 작동하는지 아는 것이 좋기 때문에 우리는 예를 연구하고 후드 아래에서 무슨 일이 일어나는지 볼 것입니다. 이 예제에서는 Qt의 많은 암시적으로 공유된 클래스 중 하나인 QString을 사용합니다. 이니셜 라이저 구문에서 역할 이름 예제가 더 나쁜 것은 가장 불행한 일입니다. 함수가 새 QHash라고 할 때마다 할당되고 채워집니다(해싱 등 포함). 초기화자 목록 구문은 단순히 구문 설탕일 뿐이며, 해싱 및 메모리 할당 비용을 피하지 않습니다.