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에 작성되었습니다.