HashMap 자료구조를 가지고 만든 컨테이너들이다. 공간을 많이 쓰게 되지만 탐색속도가 1이고, 마치 검색을 하듯 찾을 수 있어서 좋다.
내가 일단 습득한 사용법에 대해서만 서술한다.
먼저 std::unordered_map은 key -> value에서 key값의 중복이 불가능하다.
std::unordered_map<std::string, Myclass> container;
일단 이런 식으로 2개의 자료형을 pair로 구성하여 인스턴스화 할 수 있다.
그 다음은 딱 2가지만 파악하면 웬만한 건 다 할 수 있다.
1. insert를 하는 법.
2가지 방법이 있다. 심플하게 마치 자바스크립트를 쓰는 것 처럼
MyClass instance;
container["My Class"] = instance;
요런 식으로 삽입이 가능하다.
그 다음은 insert 함수를 호출하는 것이다.
container.insert(std::make_pair("My Class", instance));
container.insert({"My Class", instance});
대략 이런 식으로 할 수 있는데, 2번째가 심플해서 사용하기 좋다.
2.value 값 얻기
이것도 심플하다. 위에도 이미 나왔지만 []연산자를 활용하여 키값에 따른 value값을 바로 얻을 수 있다.
for문 돌리기는 어떻게 하는가 하면,
for (const auto& pair : container)
{
pair.first.sadsadsadas
pari.second.aasdasa
}
요런 식으로 iterator를 뽑으면 first와 second가 나오는데 당연히 first는 key이고 second는 value이다.
다음은 std::unordered_multimap 이다.
얘는 중복된 key를 허용한다. 그렇기 때문에 키에 해당하는 모든 원소를 std::list로 가져다 주는 녀석이다. 그래서 내가 원하는 원소를 찾으려면 O(n)의 탐색속도가 걸릴 것이다.
중복된 key를 허용하기 때문에 위에서 사용한 방법과 좀 다른 양상을 보인다.
insert는 []연산자를 활용해 직접 대입은 불가능 하나 insert 함수를 사용하는 방법은 잘 먹힌다. 하지만 원하는 원소를 얻기 위해서는 Find 함수를 이용해야 한다. 그리고 리턴 값도 list로 받게 된다. []연산자는 정의되지 않아 사용할 수 없다.
1개만 있는 상태라면 Find를 통해 얻은 list에서 바로 first, second 값을 얻어내어 쓰면 된다.
'Programming' 카테고리의 다른 글
| Variadic Template :: arguments 분리하여 변수로 사용하기 (1) | 2020.01.20 |
|---|---|
| [C++] 임의의 파라미터를 받는 Template 만들기(feat.std::make_unique) (0) | 2020.01.15 |
| [C++]delete unique_ptr<T>.get() (0) | 2020.01.09 |
| [C++] constexpr (1) | 2019.12.19 |
| [C++] noexcept 선언 (1) | 2019.12.19 |