std::map<Key,T,Compare,Allocator>:: insert
|
std::
pair
<
iterator,
bool
>
insert
(
const
value_type
&
value
)
;
|
(1) | |
|
template
<
class
P
>
std:: pair < iterator, bool > insert ( P && value ) ; |
(2) | (C++11부터) |
|
std::
pair
<
iterator,
bool
>
insert
(
value_type
&&
value
)
;
|
(3) | (C++17부터) |
| (4) | ||
|
iterator insert
(
iterator pos,
const
value_type
&
value
)
;
|
(C++11 이전) | |
|
iterator insert
(
const_iterator pos,
const
value_type
&
value
)
;
|
(C++11부터) | |
|
template
<
class
P
>
iterator insert ( const_iterator pos, P && value ) ; |
(5) | (C++11부터) |
|
iterator insert
(
const_iterator pos, value_type
&&
value
)
;
|
(6) | (C++17부터) |
|
template
<
class
InputIt
>
void insert ( InputIt first, InputIt last ) ; |
(7) | |
|
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 pos, node_type
&&
nh
)
;
|
(10) | (C++17부터) |
컨테이너에 동등한 키를 가진 요소가 아직 없는 경우 요소를 삽입합니다.
[
first
,
last
)
에서 요소들을 삽입합니다. 범위 내에서 비교 시 동등한 키를 가진 여러 요소가 있는 경우, 어떤 요소가 삽입될지 명시되지 않습니다 (보류 중인
LWG2844
).
반복자나 참조는 무효화되지 않습니다. 삽입이 성공한 경우, 노드 핸들에 보관된 동안 획득한 해당 요소에 대한 포인터와 참조는 무효화되며, 추출되기 전에 해당 요소에 대해 획득한 포인터와 참조는 유효해집니다. (C++17부터)
목차 |
매개변수
| pos | - | 새로운 요소가 삽입될 위치 앞을 가리키는 반복자 |
| value | - | 삽입할 요소 값 |
| first, last | - | 삽입할 요소들의 범위 를 정의하는 한 쌍의 반복자 |
| ilist | - | 값을 삽입할 초기화 리스트 |
| nh | - | 호환되는 노드 핸들 |
| 타입 요구사항 | ||
-
InputIt
는
LegacyInputIterator
요구사항을 충족해야 합니다.
|
||
반환값
insert_return_type
객체:
-
만약
nh
가 비어있다면,
inserted는 false ,position은 end ( ) 이며,node는 비어 있습니다. -
그렇지 않고 삽입이 발생했다면,
inserted는 true ,position은 삽입된 요소를 가리키며,node는 비어 있습니다. -
만약 삽입이 실패했다면,
inserted는 false ,node는 nh 의 이전 값을 가지며,position은 nh. key ( ) 와 동등한 키를 가진 요소를 가리킵니다.
예외
|
이 섹션은 불완전합니다
이유: cases 7-10 |
복잡도
O(log(size()))
.
O(N·log(size() + N))
, 여기서
N
은 삽입할 원소의 개수입니다.
O(log(size()))
입니다.
참고 사항
힌트를 사용한 삽입
(
(
4-6
)
및
(
10
)
)은
시퀀스 컨테이너에서의 위치 지정 삽입(예:
std::vector::insert
)과 시그니처 호환성을 유지하기 위해 불리언 값을 반환하지 않습니다. 이를 통해
std::inserter
와 같은 일반화된 삽입기를 생성할 수 있습니다. 힌트 삽입의 성공 여부를 확인하는 한 가지 방법은 삽입 전후의
size()
를 비교하는 것입니다.
예제
#include <iomanip> #include <iostream> #include <map> #include <string> using namespace std::리터럴; template<typename It> void print_insertion_status(It it, bool success) { std::cout << "Insertion of " << it->first << (success ? " 성공했습니다\n" : " 실패\n"); } int main() { std::map<std::string, float> heights; // 오버로드 3: rvalue 참조로부터 삽입 const auto [it_hinata, success] = heights.insert({"히나타"s, 162.8}); print_insertion_status(it_hinata, success); { // 오버로드 1: lvalue 참조로부터 삽입 const auto [it, success2] = heights.insert(*it_hinata); print_insertion_status(it, success2); } { // 오버로드 2: emplace로 전달하여 삽입 const auto [it, success] = heights.insert(std::pair{"카게야마", 180.6}); print_insertion_status(it, success); } { // 오버로드 6: 위치 힌트와 함께 우측값 참조로 삽입 const std::size_t n = std::size(heights); const auto it = heights.insert(it_hinata, {"아즈마네"s, 184.7}); print_insertion_status(it, std::size(heights) != n); } { // 오버로드 4: lvalue 참조로부터 위치 힌트와 함께 삽입 const std::size_t n = std::size(heights); const auto it = heights.insert(it_hinata, *it_hinata); print_insertion_status(it, std::size(heights) != n); } { // 오버로드 5: 위치 힌트와 함께 emplace로 전달하여 삽입 const std::size_t n = std::size(heights); const auto it = heights.insert(it_hinata, std::pair{"츠키시마", 188.3}); print_insertion_status(it, std::size(heights) != n); } auto node_hinata = heights.extract(it_hinata); std::map<std::string, float> heights2; // 오버로드 7: 반복자 범위에서 삽입 heights2.insert(std::begin(heights), std::end(heights)); // 오버로드 8: initializer_list에서 삽입 heights2.insert({{"코즈메"s, 169.2}, {"쿠로", 187.7}}); // 오버로드 9: 노드 삽입 const auto status = heights2.insert(std::move(node_hinata)); print_insertion_status(status.position, status.inserted); node_hinata = heights2.extract(status.position); { // 오버로드 10: 위치 힌트와 함께 노드 삽입 const std::size_t n = std::size(heights2); const auto it = heights2.insert(std::begin(heights2), std::move(node_hinata)); print_insertion_status(it, std::size(heights2) != n); } // 결과 맵 출력 std::cout << std::left (설명: HTML 태그와 속성은 그대로 유지되었으며, C++ 관련 용어인 `std::left`는 번역되지 않았습니다. 링크 텍스트가 C++ 표준 라이브러리 요소를 나타내므로 전문성을 유지한 정확한 번역입니다.) << '\n'; for (const auto& [name, height] : heights2) std::cout << std::setw(10) << name << " | " << height << "cm\n"; }
출력:
Hinata 삽입 성공 Hinata 삽입 실패 Kageyama 삽입 성공 Azumane 삽입 성공 Hinata 삽입 실패 Tsukishima 삽입 성공 Hinata 삽입 성공 Hinata 삽입 성공 Azumane | 184.7cm Hinata | 162.8cm Kageyama | 180.6cm Kozume | 169.2cm Kuroo | 187.7cm Tsukishima | 188.3cm
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 233 | C++98 | pos 는 단순 힌트였으며 완전히 무시될 수 있었음 |
삽입이
pos
바로 이전 위치에
가능한 한 가깝게 수행되어야 함 |
| LWG 264 | C++98 |
오버로드
(
7
)
의 복잡도가 범위
[
first
,
last
)
가
Compare
에 따라 정렬된 경우
선형으로 요구됨 |
이 특별한 경우에 대한
선형 요구사항 제거 |
| LWG 316 | C++98 |
오버로드
(
1
)
의 반환 값에서
어떤 bool 값이 성공적인 삽입을 나타내는지 명시되지 않음 |
성공이
true
로
표시됨 |
| LWG 2005 | C++11 | 오버로드 ( 2 ) 와 ( 5 ) 의 설명이 부적절함 | 설명 개선 |
참고 항목
|
(C++11)
|
제자리에서 요소를 생성
(public member function) |
|
(C++11)
|
힌트를 사용하여 제자리에서 요소 생성
(public member function) |
|
(C++17)
|
요소를 삽입하거나 키가 이미 존재하는 경우 현재 요소에 할당
(public member function) |
|
인수에서 추론된 타입의
std::insert_iterator
생성
(function template) |