프로그래밍/Morden C++

std::map

MAKGA 2021. 10. 5. 22:17
320x100

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를 사용하는게 좋지 않을까 생각한다.

https://www.ikpil.com/541

 

항목 24: map::operator[]나 map::insert는 효율 문제에 주의하여 선택하자

내가 STL에 조예가 깊어서 글을 남기는 것이 아니라, Effecitve STL 을 공부하는 사람들이 이 글을 보고, 도움이 되었으면 하는 생각과, 혹시 내가 틀린것이 있다면 지적해 주시지 않을까 란 생각으로

www.ikpil.com

 

작업하다가 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);
320x100

'프로그래밍 > 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