std::set<Key,Compare,Allocator>:: insert
|
std::
pair
<
iterator,
bool
>
insert
(
const
value_type
&
value
)
;
|
(1) | (constexpr since C++26) |
|
std::
pair
<
iterator,
bool
>
insert
(
value_type
&&
value
)
;
|
(2) |
(since C++11)
(constexpr since C++26) |
| (3) | ||
|
iterator insert
(
iterator pos,
const
value_type
&
value
)
;
|
(until C++11) | |
|
iterator insert
(
const_iterator pos,
const
value_type
&
value
)
;
|
(since C++11)
(constexpr since C++26) |
|
|
iterator insert
(
const_iterator pos, value_type
&&
value
)
;
|
(4) |
(since C++11)
(constexpr since C++26) |
|
template
<
class
InputIt
>
void insert ( InputIt first, InputIt last ) ; |
(5) | (constexpr since C++26) |
|
void
insert
(
std::
initializer_list
<
value_type
>
ilist
)
;
|
(6) |
(since C++11)
(constexpr since C++26) |
|
insert_return_type insert
(
node_type
&&
nh
)
;
|
(7) |
(since C++17)
(constexpr since C++26) |
|
iterator insert
(
const_iterator pos, node_type
&&
nh
)
;
|
(8) |
(since C++17)
(constexpr since C++26) |
|
template
<
class
K
>
std:: pair < iterator, bool > insert ( K && x ) ; |
(9) |
(since C++23)
(constexpr since C++26) |
|
template
<
class
K
>
iterator insert ( const_iterator pos, K && x ) ; |
(10) |
(since C++23)
(constexpr since C++26) |
요소를 * this 에 삽입하려고 시도합니다.
- 만약 * this 가 이미 동등한 키를 가진 요소를 포함하고 있다면, 아무 작업도 수행하지 않습니다.
- 그렇지 않으면, 요소를 * this 에 삽입합니다.
| (since C++11) |
[
first
,
last
)
에서 요소들을 삽입합니다.
|
(C++11부터) |
- first 또는 last 가 * this 의 반복자인 경우.
value_type
타입의 객체
u
를
std::
forward
<
K
>
(
x
)
로 생성한 다음
u
를
*
this
에 삽입합니다. 동등한 키의 존재 여부는
u
를 생성하기 전에
x
를 사용하여 투명하게 결정됩니다.
-
value_type이(가) EmplaceConstructible 으로set에 std:: forward < K > ( x ) 로부터 생성 가능하지 않은 경우. - equal_range ( u ) == equal_range ( x ) 가 false 인 경우.
-
Compare가 transparent 인 경우. - std:: is_convertible_v < K && , const_iterator > 가 false 인 경우.
- std:: is_convertible_v < K && , iterator > 가 false 인 경우.
반복자나 참조는 무효화되지 않습니다. 삽입이 성공한 경우, 노드 핸들에 보관된 동안 획득한 해당 요소에 대한 포인터와 참조는 무효화되며, 추출되기 전에 해당 요소에 대해 획득한 포인터와 참조는 유효해집니다. (C++17부터)
목차 |
매개변수
| pos | - | 새로운 요소가 삽입될 위치 앞을 가리키는 반복자 |
| value | - | 삽입할 요소 값 |
| first, last | - | 삽입할 요소들의 소스 범위 를 정의하는 한 쌍의 반복자 |
| ilist | - | 값을 삽입할 초기화 리스트 |
| nh | - | 호환되는 노드 핸들 |
| x | - | 키와 투명하게 비교될 수 있는 임의 타입의 값 |
| 타입 요구사항 | ||
-
InputIt
는
LegacyInputIterator
요구사항을 충족해야 함.
|
||
반환값
insert_return_type
객체:
-
만약
nh
가 비어있다면,
inserted는 false ,position은 end ( ) 이며,node는 비어 있습니다. -
그렇지 않고 삽입이 발생했다면,
inserted는 true ,position은 삽입된 요소를 가리키며,node는 비어 있습니다. -
만약 삽입이 실패했다면,
inserted는 false ,node는 nh 의 이전 값을 가지며,position은 nh. key ( ) 에 해당하는 키를 가진 요소를 가리킵니다.
예외
단일 요소 삽입 과정 중 어떤 연산에서 예외가 발생하면, 삽입은 아무런 효과를 가지지 않습니다.
복잡도
주어진 N 을 size ( ) 로:
참고 사항
힌트를 사용한 삽입
(
(
3,4
)
,
(
8
)
및
(
10
)
)은
순차 컨테이너의 위치 기반 삽입(예:
std::vector::insert
)과 시그니처 호환성을 유지하기 위해 부울 값을 반환하지 않습니다. 이를 통해
std::inserter
와 같은 일반화된 삽입기를 생성할 수 있습니다. 힌트 삽입의 성공 여부를 확인하는 한 가지 방법은 삽입 전후의
size()
값을 비교하는 것입니다.
오버로드 ( 5,6 ) 는 일반적으로 힌트로 end() 를 사용하여 오버로드 ( 3 ) 를 호출하는 루프로 구현됩니다; 이들은 정렬된 시퀀스(예: 다른 std::set )의 가장 작은 요소가 * this 의 마지막 요소보다 큰 경우에 대한 추가 작업에 최적화되어 있습니다.
범위 내에 비교 동등한 키를 가진 여러 요소가 있는 경우, 어떤 요소가 삽입될지 지정되지 않습니다 (보류 중인 LWG2844 ).
| Feature-test 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_lib_associative_heterogeneous_insertion
|
202311L
|
(C++26) | 정렬된 및 비정렬 연관 컨테이너 에서 남아있는 멤버 함수들에 대한 이종(heterogeneous) 오버로드. ( 9,10 ) |
예제
#include <cassert> #include <iostream> #include <set> int main() { std::set<int> set; auto result_1 = set.insert(3); assert(result_1.first != set.end()); // 유효한 반복자입니다 assert(*result_1.first == 3); if (result_1.second) std::cout << "insert done\n"; auto result_2 = set.insert(3); assert(result_2.first == result_1.first); // 동일한 반복자 assert(*result_2.first == 3); if (!result_2.second) std::cout << "no insertion\n"; }
출력:
insert done no insertion
결함 보고서
다음 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 233 | C++98 | pos 가 단순 힌트였으며 완전히 무시될 수 있었음 |
삽입은
pos
바로 이전 위치에
가능한 한 가깝게 수행되어야 함 |
| LWG 264 | C++98 |
오버로드
(
5
)
의 복잡도는 범위
[
first
,
last
)
가
Compare
에 따라 정렬된 경우
선형으로 요구되었음 |
이 특별한 경우에 대한
선형 요구사항 제거 |
| LWG 316 | C++98 |
오버로드
(
1
)
의 반환 값에서
어떤 bool 값이 성공적인 삽입을 나타내는지 명시되지 않았음 |
성공은 true 로 표시됨 |
참고 항목
|
(C++11)
|
제자리에서 요소를 생성
(public member function) |
|
(C++11)
|
힌트를 사용하여 제자리에서 요소들을 생성
(public member function) |
|
인자로부터 추론된 타입의
std::insert_iterator
를 생성
(function template) |