logo

C++ STL의 unordered_map

순서가 없는_지도 키 값과 매핑된 값의 조합으로 형성된 요소를 저장하는 관련 컨테이너입니다. 키 값은 요소를 고유하게 식별하는 데 사용되며 매핑된 값은 키와 연결된 콘텐츠입니다. 키와 값은 모두 사전 정의되거나 사용자 정의된 유형일 수 있습니다. 간단히 말해서, 순서가 없는_지도 요소 자체를 저장하는 사전형 데이터 구조와 같습니다. 여기에는 고유한 키를 기반으로 개별 요소를 빠르게 검색할 수 있는 연속적인 쌍(키, 값)이 포함되어 있습니다.

자바 반복 맵

내부적으로 unordered_map은 Hash Table을 사용하여 구현되며, map에 제공된 키는 해시 테이블의 인덱스로 해시됩니다. 이는 데이터 구조의 성능이 해시 함수에 많이 의존하지만 평균적으로 비용이 많이 드는 이유입니다. 검색, 삽입, 삭제 해시 테이블의 값은 O(1)입니다.



메모: 최악의 경우, 시간 복잡도는 O(1)에서 O(n)으로 갈 수 있으며, 특히 큰 소수의 경우 더욱 그렇습니다. 이런 상황에서는 TLE(Time Limit Exceeded) 오류를 피하기 위해 대신 지도를 사용하는 것이 좋습니다.

통사론:

예제가 포함된 unordered_map 구문

unordered_map 구문



다음은 순서가 지정되지 않은 맵을 보여주는 C++ 프로그램입니다.

C++






// C++ program to demonstrate> // functionality of unordered_map> #include> #include> using> namespace> std;> > // Driver code> int> main()> {> >// Declaring umap to be of> >// type key> >// will be of STRING type> >// and mapped VALUE will> >// be of int type> >unordered_mapint>우맵; // [] 연산자를 사용하여 값 삽입 umap['techcodeview.com'] = 10; umap['연습'] = 20; umap['기여'] = 30; // (auto x : umap) cout에 대해 순서가 지정되지 않은 맵을 탐색합니다.<< x.first << ' ' << x.second << endl; }>

>

>

산출

Contribute 30 Practice 20 techcodeview.com 10>
unordered_map 예제가 포함된 출력

unordered_map 출력

설명: 이 출력이 정당화하는 구체적인 점은 unordered_map의 결과 값이 임의의 키 대 값 방식으로 생성되는 반면 맵은 값과 키를 순서대로 표시한다는 것입니다.

unordered_map 대 unordered_set

순서가 지정되지 않은_지도

순서가 지정되지 않은_세트

Unordered_map에는 (키-값) 쌍 형식의 요소만 포함됩니다. Unordered_set에는 반드시 키-값 쌍 형태의 요소가 포함될 필요는 없으며 주로 집합의 유무를 확인하는 데 사용됩니다.
운영자 ' []' 맵에 존재하는 키의 해당 값을 추출합니다. 요소 검색은 다음을 사용하여 수행됩니다. 찾다 () 기능. 따라서 연산자[]가 필요하지 않습니다.

메모: 예를 들어, 개별 단어의 빈도를 계산하는 문제를 생각해 보세요. unordered_map을 사용할 수 있지만 개수를 저장할 수 없으므로 unordered_set(또는 set)을 사용할 수 없습니다.

unordered_map 대 지도

순서가 지정되지 않은_지도

지도

unordered_map 키는 어떤 순서로도 저장될 수 있습니다. 맵은 순서가 지정된 고유 키 시퀀스입니다.
Unordered_Map은 요소 간의 순서를 유지할 수 없는 불균형 트리 구조를 구현합니다. Map은 균형 잡힌 트리 구조를 구현하므로 (특정 트리 순회를 통해) 요소 간의 순서를 유지할 수 있습니다.
unordered_map 작업의 시간 복잡도는 평균 O(1)입니다. 맵 연산의 시간 복잡도는 O(log n)입니다.

unordered_map의 메소드

unordered_map에서 작동하는 많은 함수를 사용할 수 있습니다. 그 중 가장 유용한 것은 다음과 같습니다:

    연산자 = 연산자 [] 용량의 빈 크기는 반복자의 시작 및 끝입니다. 검색을 위해 찾아서 계산합니다. 수정을 위해 삽입하고 지웁니다.

아래 표는 unordered_map 메소드의 전체 목록을 보여줍니다.

방법/함수

설명

에() C++ unordered_map의 이 함수는 요소가 키 k인 값에 대한 참조를 반환합니다.
시작하다() unordered_map 컨테이너의 첫 번째 요소를 가리키는 반복자를 반환합니다.
끝() unordered_map 컨테이너에 있는 컨테이너의 마지막 요소 다음 위치를 가리키는 반복자를 반환합니다.
버킷() 맵에서 키 k를 가진 요소가 위치한 버킷 번호를 반환합니다.
버킷_개수 Bucket_count는 총 개수를 계산하는 데 사용됩니다. unordered_map의 버킷 수입니다. 이 함수에 전달하는 데 매개변수가 필요하지 않습니다.
버킷_크기 unordered_map의 각 버킷에 있는 요소 수를 반환합니다.
세다() 주어진 키를 사용하여 unordered_map에 존재하는 요소 수를 계산합니다.
동일_범위 k와 비교되는 키를 사용하여 컨테이너의 모든 요소를 ​​포함하는 범위의 경계를 반환합니다.
찾다() 요소에 반복자를 반환합니다.
비어 있는() unordered_map 컨테이너에서 컨테이너가 비어 있는지 확인합니다.
삭제() unordered_map 컨테이너의 컨테이너 요소 지우기

C++11 라이브러리는 내부적으로 사용되는 버킷 수, 버킷 크기, 사용된 해시 함수 및 다양한 해시 정책을 볼 수 있는 기능도 제공하지만 실제 애플리케이션에서는 유용성이 떨어집니다. Iterator를 사용하여 unordered_map의 모든 요소를 ​​반복할 수 있습니다.

C++




// C++ program to demonstrate> // Initialization, indexing,> // and iteration> #include> #include> using> namespace> std;> > // Driver code> int> main()> {> >// Declaring umap to be of> >// type key> >// will be of string type and> >// mapped value will be of double type> >unordered_mapdouble>umap = { //맵 {'One', 1}, {'Two', 2}, {'Three', 3} }에 직접 요소 삽입 }; // [] 연산자를 사용하여 값 삽입 umap['PI'] = 3.14; umap['root2'] = 1.414; umap['root3'] = 1.732; umap['log10'] = 2.302; umap['loge'] = 1.0; // 삽입 함수로 값 삽입 umap.insert(make_pair('e', 2.718)); 문자열 키 = 'PI'; // 맵 반복자에서 키를 찾을 수 없는 경우 // to end가 반환됩니다. if (umap.find(key) == umap.end()) cout<< key << ' not found '; // If key found then iterator to that // key is returned else cout << 'Found ' << key << ' '; key = 'lambda'; if (umap.find(key) == umap.end()) cout << key << ' not found '; else cout << 'Found ' << key << endl; // iterating over all value of umap unordered_mapdouble>::반복자 itr; 시합<< ' All Elements : '; for (itr = umap.begin(); itr != umap.end(); itr++) { // itr works as a pointer to // pair type // itr->먼저 키 부분을 저장하고 // itr->두 번째는 값 부분 cout ' '를 저장합니다.<< itr->두번째<< endl; } }>

>

>

문자열을 정수로 변환하는 방법 java
산출

Found PI lambda not found All Elements : e 2.718 loge 1 log10 2.302 Two 2 One 1 Three 3 PI 3.14 root2 1.414 root3 1.732>

개별 단어의 빈도 찾기

일련의 단어가 주어지면 과제는 개별 단어의 빈도를 찾는 것입니다.

입력: str = 괴짜를 위한 괴짜 괴짜 퀴즈 연습 qa for;
산출: 개별 단어의 빈도는
(연습, 1)
(용, 2)
(qa, 1)
(퀴즈, 1)
(괴짜, 3)

다음은 위의 접근 방식을 구현하는 C++ 프로그램입니다.

C++




// C++ program to find freq> // of every word using unordered_map> #include> using> namespace> std;> > // Prints frequencies of> // individual words in str> void> printFrequencies(>const> string &str)> {> >// declaring map of type,> >// each word is mapped to its frequency> >unordered_mapint>워드빈도; // 문자열 스트림을 사용하여 입력을 단어로 분리합니다. // 단어를 분리하는 데 사용됩니다. stringstream ss(str); // 개별 단어를 저장하려면 string word; while (ss>> 단어) wordFreq[단어]++; // 이제 단어, 주파수 쌍을 반복하고 // unordered_mapint>:: iterator p 형식으로 인쇄합니다. for (p = wordFreq.begin(); p != wordFreq.end(); p++) cout<< '(' ', ' << p->두번째<< ') '; } // Driver code int main() { string str = 'geeks for geeks geeks quiz ' 'practice qa for'; printFrequencies(str); return 0; }>

>

>

산출

(practice, 1) (for, 2) (qa, 1) (quiz, 1) (geeks, 3)>

unordered_map의 최근 기사