팀(Tim)
개발자의 글쓰기
팀(Tim)
전체 방문자
오늘
어제
  • 분류 전체보기 (49)
    • 알고리즘 (2)
    • 개발전반 (1)
    • 안드로이드 앱개발 (25)
    • 코틀린 (1)
    • C++ (11)
    • Unity (0)
    • 공지사항 (4)
    • WebGL (0)
    • Flutter (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • d

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
팀(Tim)

개발자의 글쓰기

C++

STL - map

2020. 10. 27. 02:14

 

표준 연관 컨테이너 (비선형적)

트리구조이다.

 

map은 key와 value를 한 쌍으로 가진다.

 

map<int, int> myMap;

 

인덱스를 통해 접근이 가능하다.

 

myMap[1]



원소 삽입

map은 원소삽입시 key와 value를 직접적으로 전달 할 수 없고,

pair라는 객체를 전달해야한다.

 

방법1

- myMap.insert(pair<int, int>(3,5))

 

방법2

- myMap.insert(make_pair(3,5))

 

방법3

-myMap.insert(map<int, int>::value_type(3,5)) // key는 저절로 const가 됨

 

방법4

- myMap[1] = 100; // 1이라는 키가 없을 경우 생성하고, 있을경우 value를 '수정'한다.

-> 맵의 키를 탐색하기 때문에 시간이 오래걸린다. '수정'하기 때문에 예상치 못한 동작을 할 수 있다.

(insert를 통한 삽입은 key가 없으면 추가하고, 있으면 '무시'한다.)

 

방법5

- myMap.emplace(3,5);

 

방법6

유니폼 초기화

- myMap.insert({3,5})

 

 

중간 삽입

의미없다. 원소 삽입시 자동 정렬되기 때문에.

 

 

중간 삭제

노드 기반 컨테이너이므로 중간 삭제를 하여도 end가 무효화되지 않는다.

 

 

반복자

양방향 반복자다. 즉, ++ 과 --만 가능.

*iter의 결과는 pair객체다. 따라서 (*iter).first처럼 하거나  

iter->first 이런식으로 키값조회 가능.

 

정렬

맵은 디폴트로 오름차순 정렬이다.

내림차순으로 정렬하고 싶으면 조건자를 쓰면 된다.

map<int, int, greater<int>> myMap;

 

탐색

find의 인자로 key값을 주면 해당 위치의 반복자를 반환한다.

만약 없을경우, end를 반환한다.

map<int, int>::iterator iter = myMap.find(3);

 

map에 key를 문자열로할 경우

myMap.insert(map<char*, int>::value_type("AAA", 100));

 

-> char*형이므로 그저 주소값이다. 따라서 또다시

 

myMap.insert(map<char*, int>::value_type("AAA", 100));

 

이렇게해도 가능하다. 주소값은 다르기 때문이다.

이런 것을 막기 위해 알고리즘 함수인 find_if를 쓴다.

 

auto& iter = find_if(myMap.begin(), myMap.end(), CStringCmp("AAA"));

 

if(iter != MyMap.end())

    cout << iter->first << ", " << iter->second << endl;

이렇게 조건자를 정의해주고 넣으면 문자열비교로 찾는게 가능하다.



class CStringCmp

{

public:

    CStringCmp(const char* _strKey) : m_strKey(_strKey) {}



public:

    template <typename T>

    bool operator()(T& _Dst)

    {

        return !strcmp(m_strKey, _Dst.first);

    }



private:

    const char* m_strKey;

};

 

-> find_if의 조건자는 단항 조건자이므로 인자 하나를 받는 함수객체로 정의해야한다.

operator의 _Dst는 find_if함수에서 맵을 순회하며 원소를 하나하나 인자로 넣는 식으로 알아서 호출해준다.

 

-> 귀찮으니까 그냥 string을 쓰도록하자. string은 비교연산자가 정의되어있어서 이럴 필요가 없다.

'C++' 카테고리의 다른 글

링커  (0) 2021.09.04
STL - queue  (0) 2020.10.27
STL - list  (0) 2020.10.27
STL - iterator  (0) 2020.10.27
STL - vector  (0) 2020.10.27
    'C++' 카테고리의 다른 글
    • 링커
    • STL - queue
    • STL - list
    • STL - iterator
    팀(Tim)
    팀(Tim)

    티스토리툴바