[Basic C++] #41_unordered_map, 비순차 연관 컨테이너
C++ 개발에서 "unordered_map"에 대해 알아보겠습니다.
"전문가를 위한 C"의 16 항목, "컨테이너와 반복자 이해하기"에 해당하는 내용입니다.
Overview
- 개념
- 초기화
- 그 외 자체 메서드
#0. 개념
template <class Key, // == 키
class T, // == 매핑된 형식
class Hash = hash< Key>, // == 해시 함수 객체 형식
class Pred = std::equal_to<Key>, // == 프레디킷 형식
class Alloc = std::allocator<std::pair<const Key, T>> // == 할당자 클래스
class unordered_map;
Details
- C++ 표준 라이브러리에서 제공하는 지정된 형식의 키와 데이터 값을 한 쌍으로 해시 테이블 자료구조를 활용하여 저장하는 비 순차 연관 컨테이너입니다.
- 접근, 삽입, 그리고 제거 알고리즘은 map과 동일합니다.
#1. 초기화
#include <unordered_map>
int main()
{
// initializer list 활용
unordered_map <int, string> umap = {
{1, "One"},
{2, "Two"},
{3, "Three"}
};
}
Details
- 초기화 리스트를 활용합니다.
- make_pair를 활용할 수 있습니다.
#2. 그 외 자체 메서드
// 전화 번호 목록을 출력합니다, 사람 이름은 키가 되고, 전화 번호는 키와 매핑된 값이됩니다.
template<class T>
void printMap(const T& _map)
{
for(auto& val : _map)
{
cout << val.first << " (Phone: " << val.second << ")" << endl;
}
cout << "--------" << endl;
}
int main()
{
// unordered_map의 유니폼 초기화 사용
unordered_map <string, string> um = {
{"박보영", "010-1111-1111"},
{"신세경", "010-2222-2222"}
};
printMap(um);
// unordered_map의 삽입과 삭제
um.insert(make_pair("장원영", "010-3333-3333")); // 1. insert() 사용
um["최예나"] = "010-4444-4444"; // 2. operator[] 사용
um["김민주"] = "010-5555-5555";
um.erase("박보영");
printMap(um);
// 특정 키에대한 버킷 인덱스
int bucketNo = um.bucket("김민주"); // 특정 키에대한 버킷 인덱스
int bucketSize = um.bucket_size(bucketNo) // 버킷 인덱스가 담고있는 항목의 개수
// 특정 버킷 인덱스의 첫 번재 반복자 그리고 마지막 직후의 반복자
auto mapBeginIter = um.cbegin(bucketNo);
auto mapEndIter = um.cend(bucketNo);
// 총 버킷의 개수, 이들이 담고 있는 평균 항목 개수
auto totalBucketNo = um.bucket_count();
auto meanDataNoPerBucket = um.load_factor();
}
Details
- "unordered_map", 즉 해시 테이블이 제공하는 메서드들은 주로 "버킷"에 중점을 두는 것 같습니다.
- 특정 컨테이너의 bucket 개수부터, bucket을 순회하는 반복자 등 버킷과 관련된 메서들로 구성되어 있습니다.
'언어 > Basic C++' 카테고리의 다른 글
[Basic C++] #43_STL 알고리즘, find, find_if (0) | 2022.07.05 |
---|---|
[Basic C++] #42_unordered_multimap, 비순차 연관 컨테이너, 중복 허용 (0) | 2022.06.28 |
[Basic C++] #40_해시함수, 비순차 연관 컨테이너, 해시 테이블 (0) | 2022.06.24 |
[Basic C++] #39_multimap, 연관 컨테이너, 중복 허용 (0) | 2022.06.24 |
[Basic C++] #38_map, 연관 컨테이너 (0) | 2022.06.23 |