flat_set_emplace
flat_set_emplace (std::flat_set::emplace — 제자리 구성 삽입)
std::flat_set에 새 원소를 변환식으로 제자리(in-place) 구성해 삽입하는 멤버 함수예요. 같은 키가 이미 있으면 삽입하지 않아요. 반환값은 삽입 성공 여부를 함께 알려줘요.
출처: cppreference
본문
시그니처는 다음과 같아요.
template< class... Args >
std::pair<iterator, bool> emplace( Args&&... args ); // (since C++23)
주어진 args로 제자리 구성된 새 원소를, 컨테이너에 그 키를 가진 원소가 없을 때만 삽입해요.
먼저 std::forward<Args>(args)...로 value_type 타입의 객체 t를 초기화한 다음, 다음과 같이 t를 삽입해요.
auto it = ranges::upper_bound(c, t, compare);
c.insert(it, std::move(t));
이 오버로드는 std::is_constructible_v<value_type, Args...>가 true일 때만 오버로드 해석에 참여해요. emplace를 조심히 쓰면 불필요한 복사나 이동 연산을 피하면서 새 원소를 구성할 수 있어요.
매개변수
args: 원소의 생성자에 전달할 인자들.
반환값
키가 이미 있으면 {성공 여부=false, 기존 원소への 이터레이터}의 쌍, 그렇지 않으면 {true, 삽입된 원소의 이터레이터}의 쌍.
예외
어떤 이유로든 예외가 던져지면 이 함수는 아무 효과도 없어요.
복잡도
내부 컨테이너 크기에 대해 로그(logarithmic)에다가 원소 복사/이동 비용이 추가돼요.
예제
#include <flat_set>
#include <iostream>
int main()
{
std::flat_set<int> s;
auto [it1, ok1] = s.emplace(3);
auto [it2, ok2] = s.emplace(3); // 이미 있음
std::cout << ok1 << ' ' << ok2 << '\n'; // 1 0
}