새소식

언어/C++

c++ std::map 사용법 총 정리2 (insert, erase, clear, find 등)

  • -

std::map 사용법 총 정리 2편입니다
http://www.cplusplus.com/reference/map/map/?kw=map를 참조하여 작성 되었습니다

modifiers

1. insert

insert는 map의 member function으로 element를 추가할 수 있습니다(추가된 element 만큼 크기가 늘어남)
같은 key를 가지고 있는 element가 없다면 넣고, 있다면 추가되지 않고 존재하는 element의 iterator를 반환합니다.
중복 요소를 넣고 싶다면 multimap 이용!!
insert를 이용해 넣을 수도 있지만 1편에서 정리한 operator[]를 이용해 값을 넣을 수도 있습니다
insert의 constructor 형태는 총 4가지가 있습니다
형태는 다음과 같습니다

1번 형태

pair<iterator,bool> insert (const value_type& val);
template <class P> pair<iterator,bool> insert (P&& val);

형태를 보면 value_type(pair<const key_type, mapped_type>)을 넣게되면
그 위치의 iterator를 반환하는 것을 알 수 있습니다.

예제 1번 (single parameter)

int main() {
    map<char, int> mymap;

    pair<map<char, int>::iterator, bool> a = mymap.insert(pair<char, int>('a', 100));
    if (a.second) {
        cout << "It has been saved successfully" << endl;
        cout << a.first->first << ": " << a.first->second << endl;
    }
    else {
        cout << "element 'a' already existed" << endl;
    }
    return 0;
}

위에서 볼 수 있듯이 insert하게 되면 pair<iterator, bool>을 반환합니다
성공적으로 추가가 된다면 bool 값으로 true가 들어가게 되고 아니라면 false가 반환됩니다.

2번째 형태


iterator insert (const_iterator position, const value_type& val);
template <class P> iterator insert (const_iterator position, P&& val);

iterator를 hint로 줘서 insert를 최적화 시킬 수 있다는 것 같습니다

예제 2번(with hint position)

int main() {
    map<char, int> mymap;

    mymap.insert(std::pair<char, int>('a', 100));
    mymap.insert(std::pair<char, int>('z', 200));

    // 2번 contructor
    map<char, int>::iterator it = mymap.begin();
    mymap.insert(it, pair<char, int>('b', 300));    // 최대 효율로 넣기
    mymap.insert(it, pair<char, int>('c', 400));    // 최대 효율 X

    return 0;
}

a, z가 들어가있는 상태에서 'b'를 넣게 되면 최대 효율을 내서 넣을 수 있지만
a, b, z인 상태에서 c를 앞에서 넣게 되면 뒤에서 넣는것 보다 효율이 좋지 못합니다.(이때는 mymap.end()로 하는게 더 효율 좋음)

3번째 형태

template <class InputIterator>
  void insert (InputIterator first, InputIterator last);

예제 3번(range insertion)

int main() {
    map<char, int> mymap;

    mymap.insert(pair<char, int>('a', 100));
    mymap.insert(pair<char, int>('z', 200));
    mymap.insert(pair<char, int>('z', 500));
    mymap.insert(pair<char, int>('b', 300));
    mymap.insert(pair<char, int>('c', 400));

    map<char, int> another;
    another.insert(mymap.begin(), mymap.find('c'));

    for (pair<char, int> p : another) {
        cout << p.first << ": " << p.second << endl;
    }
    return 0;
}

위 처럼 iterator로 범위를 정해서 넣을 수 있습니다
범위는 [first, last) 입니다
그래서 위 에서 처음 부터 'c'를 찾은 위치의 이전까지 이므로 another 변수에 a,b만 들어가게 됩니다

4번째

4번째는 다음과 같은 형태로도 값을 넣을 수 있습니다

map<char, int> mymap;
mymap.insert({ {'k', 233}, {'l', 12} });

 

2. erase

erase는 3가지 형태를 알면 됩니다.
map에서 이를 통해 element를 지울 수 있습니다

1번 형태

iterator  erase (const_iterator position);

iteraotr를 값으로 넣어서 그 위치의 값을 지울 수 있습니다

int main() {
    map<char, int> mymap;

    mymap['a'] = 10;
    mymap['b'] = 20;
    mymap['c'] = 30;

    map<char, int>::iterator it = mymap.find('c');

    mymap.erase(it);

    for (pair<char, int> p : mymap) {
        cout << p.first << ": " << p.second << endl;
    }

    return 0;
}

'c'의 위치를 찾아 iterator를 반환하여 element를 지웠습니다

2번 형태

size_type erase (const key_type& k);

바로 key 값을 통해서 지울 수도 있습니다

예제

int main() {
    map<char, int> mymap;

    mymap['a'] = 10;
    mymap['b'] = 20;

    mymap.erase('a');

    for (pair<char, int> p : mymap) {
        cout << p.first << ": " << p.second << endl;
    }

    return 0;
}

3번 형태

iterator  erase (const_iterator first, const_iterator last);

3번째 형태는 iterator 범위를 통해 값을 제거할 수 있습니다

예제

int main() {
    map<char, int> mymap;

    mymap['a'] = 10;
    mymap['b'] = 20;
    mymap['c'] = 30;

    map<char, int>::iterator it = mymap.find('b');
    mymap.erase(it, mymap.end());

    for (pair<char, int> p : mymap) {
        cout << p.first << ": " << p.second << endl;
    }

    return 0;
}

위 처럼 iterator 범위를 통해서 b 위치에서 끝 까지 모두 지울 수 있습니다

 

3. swap

map을 바꿀 수 있습니다

int main()
{
    map<char, int> foo, bar;

    foo['x'] = 100;
    foo['y'] = 200;

    bar['a'] = 11;
    bar['b'] = 22;
    bar['c'] = 33;

    foo.swap(bar);

    cout << "foo contains:\n";
    for (pair<char, int> p : foo)
        std::cout << p.first << " => " << p.second << '\n';

    cout << "bar contains:\n";
    for (pair<char, int> p : bar)
        std::cout << bar.first << " => " << bar.second << '\n';

    return 0;
}

위 코드를 실행해보면 foo와 bar의 element가 바뀐것을 볼 수 있습니다

4. clear

이도 아주 간단합니다.
이 함수를 이용해 모든 element를 지울 수 있습니다.

int main() {
    map<char, int> mymap;
    mymap['a'] = 100;
    mymap['b'] = 200;
    mymap['c'] = 300;

    mymap.clear();

    mymap['z'] = 99;

    for (pair<char, int> p : bar)
        std::cout << bar.first << " => " << bar.second << '\n';
}

observers

1. key_comp

컨테이너가 key를 비교하는데 사용한 comparison object를 반환합니다

int main()
{
    map<char, int> mymap;

    map<char, int>::key_compare mycomp = mymap.key_comp();

    mymap['a'] = 100;
    mymap['b'] = 200;
    mymap['c'] = 300;

    cout << "mymap contains:\n";

    char highest = mymap.rbegin()->first;     // key value of last element

    map<char, int>::iterator it = mymap.begin();
    do {
        cout << it->first << " => " << it->second << '\n';
    } while (mycomp((*it++).first, 'b'));

    cout << '\n';

    return 0;
}

comparison object를 얻어서 'b'보다 작기 전까지(<) it를 이동시키며 출력합니다.

value_comp도 있으며 이도 key_comp와 유사한 방식으로 사용가능합니다


operations

1. find

find 함수를 통해 위치를 찾아 iterator를 반환합니다
만약 있지 않아 찾지 못했다면 end iterator를 반환합니다.

int main() {
    map<char, int> mymap;
    mymap['a'] = 100;
    mymap['b'] = 200;
    mymap['c'] = 50;

    // 'b'가 있으면 지운다.
    map<char, int>::iterator it = mymap.find('b');
    if (it != mymap.end()) mymap.erase(it);


}

2. count

이 함수는 해당 key가 map에 존재한다면 그 개수를 반환합니다
그런데 map은 unique한 key를 가지므로 1 아니면 0을 반환합니다.

이렇게 c++의 map에 대해 모두 알아보았습니다
진짜 많습니다

기본 insert 형태, find, erase 함수만 알아도 충분할 것 같습니다

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.