#includehash_map이 속한 namespace는 표준 STL과 다른 "stdext"입니다.
using namespace stdext;hash_map 선언은 아래와 같습니다.
hash_map< Key 자료 type, Value 자료 type > 변수 이름위에서는 Value는 저장할 데이터이고, Key는 Value와 가리키는 데이터입니다.
hash_map< int, float > hash1;다른 컨테이너와 같이 동적 할당을 할 수 있습니다.
hash_map< key 자료 type, Value 자료 type >* 변수 이름 = new hash_map< key 자료 type, Value 자료 type >; hash_map< int, float >* hash1 = new hash_map< int, float >;hash_map은 Key와 Value가 짝을 이뤄야 하므로 hash_map을 처음 보는 분들은 이전의 시퀸스 컨테이너와 다르게 좀 복잡하게 보일 것입니다. 그러나 사용이 어려운 것은 아니니 잘 따라와 주세요.
멤버 | 설명 |
begin | 첫 번째 원소의 랜덤 접근 반복자를 반환 |
clear | 저장한 모든 원소를 삭제 |
empty | 저장한 요소가 없으면 true 반환 |
end | 마지막 원소 다음의(미 사용 영역) 반복자를 반환 |
erase | 특정 위치의 원소나 지정 범위의 원소들을 삭제 |
find | Key와 연관된 원소의 반복자 반환 |
insert | 원소 추가 |
lower_bound | 지정한 Key의 요소가 있다면 해당 위치의 반복자를 반환 |
rbegin | 역방향으로 첫 번째 원소의 반복자를 반환 |
rend | 역방향으로 마지막 원소 다음의 반복자를 반환 |
size | 원소의 개수를 반환 |
upper_bound | 지정한 Key 요소가 있다면 해당 위치 다음 위치의 반복자 반환 |
원형 : pairinsert를 사용하는 세 가지 방법 중 첫 번째 방식으로 Key 타입은 int, Value 타입은 float를 추가한다면insert( const value_type& _Val ); iterator insert( iterator _Where, const value_type& _Val ); template void insert( InputIterator _First, InputIterator _Last );
hash_map두 번째 방식으로는 특정 위치에 추가할 수 있습니다.hashmap1, hashmap2; // Key는 10, Value는 45.6f를 추가. hashmap1.insert(hash_map ::value_type(10, 45.6f));
// 첫 번째 위치에 key 11, Value 50.2f를 추가 hashmap1.insert(hashmap1.begin(), hash_map세 번째 방식으로는 지정한 반복자 구간에 있는 것들을 추가합니다.::value_type(11, 50.2f));
// hashmap1의 모든 요소를 hashmap2에 추가. hashmap2.insert( hashmap1.begin(), hashmap1.end() );6.5.3 삭제
원형 : iterator erase( iterator _Where ); iterator erase( iterator _First, iterator _Last ); size_type erase( const key_type& _Key );첫 번째 방식은 특정 위치에 있는 요소를 삭제합니다.
// 첫 번째 위치의 요소 삭제. hashmap1.erase( hashmap1.begin() );두 번째 방식은 지정한 구역에 있는 요소들을 삭제합니다.
// hashmap1의 처음과 마지막에 있는 모든 요소 삭제 hashmap1.erase( hashmap1.begin(), hashmap1.end() );세 번째 방식은 지정한 키와 같은 요소를 삭제합니다.
// Key가 11인 요소 삭제. hashmap1.erase( 11 );첫 번째와 두 번째 방식의 반환 값으로는 삭제된 요소의 다음의 것을 가리키는 반복자이며 세 번째 방식은 삭제된 개수를 반환합니다.
원형 : iterator find( const Key& _Key ); const_iterator find( const Key& _Key ) const;방식은 두 가지지만 사용법은 같습니다. 차이는 반환된 반복자가 const냐 아니냐의 차이입니다. 참고로 첫 번째 방식은 const가 아니므로 찾은 요소의 Value를 변경할 수 있습니다(참고로 Key는 변경 불가입니다). 두 번째 방식은 Value도 변경할 수 없습니다.
// Key가 10인 요소 찾기. hash_mapbegin, clear, count, empty, end, rbegin, rend, size는 앞서 말 했듯이 다른 컨테이너와 사용방법이 비슷하므로 아래 예제 코드를 통해서 사용법을 보여 드리겠습니다.::Iterator FindIter = hashmap1.find( 10 ); // 찾았다면 Value를 290.44로 변경 If( FindIter != hashmap1.end() ) { FindIter->second = 290.44f; }
#include결과#include using namespace std; using namespace stdext; // 게임 캐릭터 struct GameCharacter { // 아래의 인자를 가지는 생성자를 정의한 경우는 // 꼭 기본 생성자를 정의해야 컨테이너에서 사용할 수 있다. GameCharacter() { } GameCharacter( int CharCd, int Level, int Money ) { _CharCd = CharCd; _Level = Level; _Money = Money; } int _CharCd; // 캐릭터 코드 int _Level; // 레벨 int _Money; // 돈 }; void main() { hash_map Characters; GameCharacter Character1(12, 7, 1000 ); Characters.insert(hash_map ::value_type(12, Character1)); GameCharacter Character2(15, 20, 111000 ); Characters.insert(hash_map ::value_type(15, Character2)); GameCharacter Character3(200, 34, 3345000 ); Characters.insert(hash_map ::value_type(200, Character3)); // iterator와 begin, end 사용 // 저장한 요소를 정방향으로 순회 hash_map ::iterator Iter1; for( Iter1 = Characters.begin(); Iter1 != Characters.end(); ++Iter1 ) { cout << "캐릭터 코드 : " << Iter1->second._CharCd << " | 레벨 : " << Iter1->second._Level << "| 가진 돈 : " << Iter1->second._Money << endl; } cout << endl; // rbegin, rend 사용 // 저장한 요소의 역방향으로순회 hash_map ::reverse_iterator RIter; for( RIter = Characters.rbegin(); RIter != Characters.rend(); ++RIter ) { cout << "캐릭터 코드 : " << RIter->second._CharCd << " | 레벨 : " << RIter->second._Level << "| 가진 돈 : " << RIter->second._Money << endl; } cout << endl << endl; // Characters에 저장한 요소 수 int CharacterCount = Characters.size(); // 검색. // 캐릭터 코드 15인 캐릭터를 찾는다. hash_map ::iterator FindIter = Characters.find(15); // 찾지 못했다면 FindIter은 end 위치의 반복자가 반환된다. if( Characters.end() == FindIter ) { cout << "캐릭터 코드가 20인 캐릭터가 없습니다" << endl; } else { cout << "캐릭터 코드가 15인 캐릭터를 찾았습니다." << endl; cout << "캐릭터 코드 : " << FindIter->second._CharCd << " | 레벨 : " << FindIter->second._Level << "| 가진 돈 : " << FindIter->second._Money << endl; } cout << endl; for( Iter1 = Characters.begin(); Iter1 != Characters.end(); ++Iter1 ) { cout << "캐릭터 코드 : " << Iter1->second._CharCd << " | 레벨 : " << Iter1->second._Level << "| 가진 돈 : " << Iter1->second._Money << endl; } cout << endl << endl; // 삭제 // 캐릭터 코드가 15인 캐릭터를 삭제한다. Characters.erase( 15 ); for( Iter1 = Characters.begin(); Iter1 != Characters.end(); ++Iter1 ) { cout << "캐릭터 코드 : " << Iter1->second._CharCd << " | 레벨 : " << Iter1->second._Level << "| 가진 돈 : " << Iter1->second._Money << endl; } cout << endl << endl; // 모든 캐릭터를 삭제한다. Characters.erase( Characters.begin(), Characters.end() ); // Characters 공백 조사 if( Characters.empty() ) { cout << "Characters는 비어 있습니다." << endl; } }
원형 : iterator lower_bound( const Key& _Key ); const_iterator lower_bound( const Key& _Key ) const;upper_bound
원형 : iterator lower_bound( const Key& _Key ); const_iterator lower_bound( const Key& _Key ) const;lower_bound와 upper_bound는 hahs_map에 저장된 요소를 일부분씩 나누어 처리를 할 때 유용합니다. 예를 들면 hash_map에 3,000개의 게임 캐릭터 정보를 저장되어 있으며 이것을 100개씩 나누어서 처리하고 싶을 때 사용하면 좋습니다.
#include결과#include using namespace std; using namespace stdext; // 게임 캐릭터 struct GameCharacter { GameCharacter() { } GameCharacter( int CharCd, int Level, int Money ) { _CharCd = CharCd; _Level = Level; _Money = Money; } int _CharCd; // 캐릭터코드 int _Level; // 레벨 int _Money; // 돈 }; void main() { hash_map Characters; GameCharacter Character1(12, 7, 1000 ); Characters.insert(hash_map ::value_type(12, Character1)); GameCharacter Character2(15, 20, 111000 ); Characters.insert(hash_map ::value_type(15, Character2)); GameCharacter Character3(7, 34, 3345000 ); Characters.insert(hash_map ::value_type(7, Character3)); GameCharacter Character4(14, 12, 112200 ); Characters.insert(hash_map ::value_type(14, Character4)); GameCharacter Character5(25, 3, 5000 ); Characters.insert(hash_map ::value_type(25, Character5)); hash_map ::iterator Iter1; cout << "저장한 캐릭터 리스트" << endl; for( Iter1 = Characters.begin(); Iter1 != Characters.end(); ++Iter1 ) { cout << "캐릭터 코드 : " << Iter1->second._CharCd << " | 레벨 : " << Iter1->second._Level << "| 가진 돈 : " << Iter1->second._Money << endl; } cout << endl; cout << "lower_bound(14)" < ::iterator Iter = Characters.lower_bound(14); while( Iter != Characters.end() ) { cout << "캐릭터 코드 : " << Iter->second._CharCd << " | 레벨 : " << Iter->second._Level << "| 가진 돈 : " << Iter->second._Money << endl; ++Iter; } cout << endl; cout << "upper_bound(7)" < second._CharCd << " | 레벨 : " << Iter->second._Level << "| 가진 돈 : " << Iter->second._Money << endl; ++Iter; } }
최신 콘텐츠