std::unordered_map<Key,T,Hash,KeyEqual,Allocator>:: insert
|
std::
pair
<
iterator,
bool
>
insert
(
const
value_type
&
value
)
;
|
(1) | (C++11부터) |
|
std::
pair
<
iterator,
bool
>
insert
(
value_type
&&
value
)
;
|
(2) | (C++17부터) |
|
template
<
class
P
>
std:: pair < iterator, bool > insert ( P && value ) ; |
(3) | (C++11부터) |
|
iterator insert
(
const_iterator hint,
const
value_type
&
value
)
;
|
(4) | (C++11부터) |
|
iterator insert
(
const_iterator hint, value_type
&&
value
)
;
|
(5) | (C++17부터) |
|
template
<
class
P
>
iterator insert ( const_iterator hint, P && value ) ; |
(6) | (C++11부터) |
|
template
<
class
InputIt
>
void insert ( InputIt first, InputIt last ) ; |
(7) | (C++11부터) |
|
void
insert
(
std::
initializer_list
<
value_type
>
ilist
)
;
|
(8) | (C++11부터) |
|
insert_return_type insert
(
node_type
&&
nh
)
;
|
(9) | (C++17부터) |
|
iterator insert
(
const_iterator hint, node_type
&&
nh
)
;
|
(10) | (C++17부터) |
컨테이너에 동등한 키를 가진 요소가 아직 없는 경우 요소를 삽입합니다.
[
first
,
last
)
에서 요소들을 삽입합니다. 범위 내에 비교 동등한 키를 가진 여러 요소가 있는 경우, 어떤 요소가 삽입될지 명시되지 않습니다 (보류 중인
LWG2844
).
[
first
,
last
)
가 유효한 범위가 아니거나,
first
및/또는
last
가
*
this
에 대한 반복자인 경우, 동작은 정의되지 않습니다.
만약 연산 후 새로운 원소의 개수가 기존
max_load_factor()
*
bucket_count()
보다 크면 재해싱이 발생합니다.
재해싱이 발생하는 경우(삽입으로 인해), 모든 반복자는 무효화됩니다. 그렇지 않은 경우(재해싱 없음), 반복자는 무효화되지 않습니다.
삽입이 성공하면, 노드 핸들에 보관되는 동안 획득한 해당 원소에 대한 포인터와 참조는 무효화되며, 추출되기 전에 해당 원소에 대해 획득한 포인터와 참조는 유효해집니다.
(C++17부터)
목차 |
매개변수
| hint | - | iterator, 콘텐츠 삽입 위치에 대한 제안으로 사용됨 |
| value | - | 삽입할 요소 값 |
| first, last | - | 삽입할 요소들의 소스 range 를 정의하는 iterator 쌍 |
| ilist | - | 값을 삽입할 initializer list |
| nh | - | 호환 가능한 node handle |
| Type requirements | ||
-
InputIt
는
LegacyInputIterator
요구사항을 충족해야 함.
|
||
반환값
insert_return_type
객체:
-
만약
nh
가 비어있다면,
inserted는 false ,position은 end ( ) 이며,node는 비어 있습니다. -
그렇지 않고 삽입이 발생했다면,
inserted는 true ,position은 삽입된 요소를 가리키며,node는 비어 있습니다. -
만약 삽입이 실패했다면,
inserted는 false ,node는 nh 의 이전 값을 가지며,position은 nh. key ( ) 와 동등한 키를 가진 요소를 가리킵니다.
예외
복잡도
O(1)
, 최악의 경우
O(size())
.
O(N)
, 여기서 N은 삽입할 요소의 개수입니다. 최악의 경우:
O(N * size() + N)
.
O(1)
, 최악의 경우
O(size())
.
참고 사항
힌트 삽입
(
(
4-6
)
및
(
10
)
)은
std::vector::insert
와 같은 순차 컨테이너의 위치 기반 삽입과 시그니처 호환성을 유지하기 위해 부울 값을 반환하지 않습니다. 이를 통해
std::inserter
와 같은 일반화된 삽입기를 생성할 수 있습니다. 힌트 삽입의 성공 여부를 확인하는 한 가지 방법은 삽입 전후의
size()
를 비교하는 것입니다.
예제
#include <iostream> #include <string> #include <unordered_map> int main () { std::unordered_map<int, std::string> dict = {{1, "one"}, {2, "two"}}; dict.insert({3, "three"}); dict.insert(std::make_pair(4, "four")); dict.insert({{4, "another four"}, {5, "five"}}); const bool ok = dict.insert({1, "another one"}).second; std::cout << "inserting 1 => \"another one\" " << (ok ? "succeeded" : "failed") << '\n'; std::cout << "contents:\n"; for (auto& p : dict) std::cout << ' ' << p.first << " => " << p.second << '\n'; }
가능한 출력:
inserting 1 => "another one" failed contents: 5 => five 1 => one 2 => two 3 => three 4 => four
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 2005 | C++11 |
오버로드
(
3
)
와
(
6
)
는
P
가
value_type
으로 암시적으로 변환 가능할 때만
오버로드 해결에 참여함 |
value_type
이
P
&&
로부터 생성 가능할 때만
참여함 |
참고 항목
|
제자리에서 요소를 생성
(public member function) |
|
|
힌트를 사용하여 제자리에서 요소 생성
(public member function) |
|
|
(C++17)
|
요소를 삽입하거나 키가 이미 존재하는 경우 현재 요소에 할당
(public member function) |
|
인수에서 유추된 타입의
std::insert_iterator
생성
(function template) |