map은 key와 value로 구성된 컨테이너로 <map>을 include해 사용할 수 있다.
선언
// key_type - 키의 오름차순으로 정렬되며 정수형 > 스트링 > 사용자 정의 타입 순으로 느려진다.
std::map<key_type, data_type> map_container;
데이터 삽입
insert의 결과로 pair가 리턴되며, second값이 bool 타입이므로 insert의 성공여부를 알 수 있다.
map_container.insert(std::make_pair(key, data));
데이터를 삽입하기에 가장 편한 방법이다.
map_container[key] = data;
이 두 가지 방법의 차이점에 대해 정리해둔 블로그 내용을 간략히 얘기하자면,
operator[]는 map에서 키를 먼저 찾아보고 없는 경우에 value의 기본 생성자로 먼저 생성 한다. 후에 전달 받은 값으로 다시 설정하기 때문에 insert보다 비효율적이라고 한다.
mapped_type& operator[](const key_type& _Keyval)
{
// find element matching _Keyval or insert with default mapped
iterator _Where = this->lower_bound(_Keyval);
if (_Where == this->end() || this->comp(_Keyval, this->_Key(_Where._Mynode())))
_Where = this->insert(_Where,
// 아래 부분 기본타입으로 생성해서 밀어 넣는다!
value_type(_Keyval, mapped_type())); // <-- 이거
return ((*_Where).second);
}
근데 개인적으론 insert를 하기 위해 find() 호출 후에 insert()를 하면 그게 그거 같다는 생각이 든다.
로직적으로 중복 데이터가 없다는 것을 확신하는 경우에만 insert를 사용하는게 좋지 않을까 생각한다.
작업하다가 map에 insert를 하는데 'while (!_Trynode->_Isnil)' 부분에서 에러가 발생한 경욱 ㅏ있다.
한글로 검색해도 별 내용이 없어서 stackoverflow를 찾아보면 map에 대한 메모리가 변조(?)되는 경우에 발생한다고 한다. 나 같은 경우엔 해당 map이 선언된 struct가 다른 로직에 의해 copy되고 move되면서 발생했던 문제였다.
데이터 찾기
find함수를 사용해 key가 존재하는지 확인할 수 있다.
해당 key가 존재하면 그 위치의 pair가, 아니면 map_container.end()가 리턴된다.
std::pair<key_type, data_type> pair = map_container.find(key);
data_type data = map_container[key];
map_container.contains(key);
컨테이너에 key로 원소의 갯수를 찾는다. multi 컨테이너가 아니므로 0 또는 1이 반환된다.
size_t count = map_container.count(key);
데이터 삭제
key로 삭제하기
map_container.erase(key);
iterator로 삭제하기
map_container.erase(iter);
'프로그래밍 > Morden C++' 카테고리의 다른 글
<memory> std::allocator<T> 클래스 (0) | 2021.10.31 |
---|---|
std::min, std::max 사용시 (0) | 2021.10.06 |
std::clamp (0) | 2021.09.29 |
std::accumulate (0) | 2021.09.22 |
[C++17] std::optional (0) | 2021.07.17 |