C++17 - 연관 컨테이너의 extract, merge, insert

2개의 연관 컨테이너를 접합(splice)하는 기능이 생겼다.
map, set, unordered_map, unordered_set와 이 들의 multi 버전 모두도 포함된다.

특정 요소 추출

extract() 멤버 함수를 사용하면 컨테이너의 특정 요소를 추출 할 수 있다.

node_type extract (const_iterator position);
node_type extract ( const key_type & x);

추출된 요소를 다른 컨테이너에 삽입

추출된 요소를 다른 컨테이너에 삽입할 때는 insert() 멤버 함수를 사용한다.

insert_return_type insert (node_type && nh);
iterator insert (const_iterator hint, node_type && nh);

2개의 연상 컨테이너를 붙일 때

2개의 연상 컨테이너를 붙일 때는 merge() 멤버 함수를 사용한다.
multi 버전이과 비 multi 버전 모두에서 사용할 수 있다.

template <class C2>
void merge(map<Key, T, C2, Allocator>& source);

template <class C2>
void merge(map<Key, T, C2, Allocator>&& source);

template <class C2>
void merge(multimap<Key, T, C2, Allocator>& source);

template <class C2>
void merge(multimap<Key, T, C2, Allocator>&& source);

예제 코드

#include <map>
#include <set>
#include <string>

int main()
{
    {
        std::map<int, std::string> src {
                                    {1,"one"}, {2,"two"}, {3,"buckle my shoe"}
                                    };
        std::map<int, std::string> dst {
                                                {3,"three"}
                                            };

        dst.insert(src.extract(src.find(1))); // 반복자로 추출해서 추가
        dst.insert(src.extract(2)); // key로 추출해서 추가

        // 삽입할 컨테이너에 이미 동일 key가 있어서 insert는 실패한다.
        auto r = dst.insert(src.extract(3));
        //  src == {}
        //  dst == {"one", "two", "three"}
        //  r.position == dst.begin() + 2
        //  r.inserted == false
        //  r.node == "buckle my shoe"
    }
    
    {
        std::set<int> src{1, 3, 5};
        std::set<int> dst{2, 4, 5};

        dst.merge(src); // src를 dst에 붙인다
        // 붙일 때 중복된 요소는 src에 남는다
        //  src == {5}
        //  dst == {1, 2, 3, 4, 5}
    }
}

이 글은 2020-05-20에 작성되었습니다.