std:: unordered_set
|
헤더 파일에 정의됨
<unordered_set>
|
||
|
template
<
class
Key,
|
(1) | (C++11부터) |
|
namespace
pmr
{
template
<
|
(2) | (C++17부터) |
std::unordered_set
는
Key
타입의 고유한 객체 집합을 포함하는 연관 컨테이너입니다. 검색, 삽입, 제거 연산의 평균 시간 복잡도는 상수입니다.
내부적으로 요소들은 특정 순서로 정렬되지 않고 버킷(bucket)으로 구성됩니다. 요소가 어떤 버킷에 배치되는지는 전적으로 해당 값의 해시(hash)에 따라 결정됩니다. 이는 해시가 계산되면 해당 요소가 배치된 정확한 버킷을 참조하므로 개별 요소에 대한 빠른 접근을 가능하게 합니다.
컨테이너 요소는 수정될 수 없습니다(비상수 반복자에 의해서도). 요소의 해시를 변경하여 컨테이너를 손상시킬 수 있기 때문입니다.
std::unordered_set
는
Container
,
AllocatorAwareContainer
,
UnorderedAssociativeContainer
요구 사항을 충족합니다.
std::unordered_set
의 모든 멤버 함수는
constexpr
입니다: 상수 표현식 평가에서
std::unordered_set
객체를 생성하고 사용하는 것이 가능합니다.
그러나
|
(C++26부터) |
목차 |
반복자 무효화
| 연산 | 무효화 여부 |
|---|---|
| 모든 읽기 전용 연산, swap , std::swap | 절대 없음 |
| clear , rehash , reserve , operator= | 항상 |
| insert , emplace , emplace_hint | 재해시가 발생하는 경우에만 |
| erase | 삭제된 요소에 대해서만 |
참고 사항
- swap 함수들은 컨테이너 내부의 어떤 반복자도 무효화하지 않지만, swap 영역의 끝을 표시하는 반복자는 무효화합니다.
- 컨테이너에 저장된 데이터에 대한 참조와 포인터는 해당 반복자가 무효화되는 경우에도 해당 요소를 삭제할 때에만 무효화됩니다.
- 컨테이너 이동 할당 후, 호환되지 않는 할당자에 의한 요소별 이동 할당이 강제되지 않는 한, 이동된 컨테이너에 대한 참조, 포인터 및 반복자(끝 반복자 제외)는 유효하게 유지되지만, 이제는 * this 에 있는 요소를 참조합니다.
템플릿 매개변수
|
이 섹션은 불완전합니다
이유: 템플릿 매개변수에 대한 설명을 추가하십시오. |
멤버 타입
| 유형 | 정의 |
key_type
|
Key
|
value_type
|
Key
|
size_type
|
부호 없는 정수 형식 (일반적으로 std::size_t ) |
difference_type
|
부호 있는 정수 형식 (일반적으로 std::ptrdiff_t ) |
hasher
|
Hash
|
key_equal
|
KeyEqual
|
allocator_type
|
Allocator
|
reference
|
value_type & |
const_reference
|
const value_type & |
pointer
|
std:: allocator_traits < Allocator > :: pointer |
const_pointer
|
std:: allocator_traits < Allocator > :: const_pointer |
iterator
|
상수
LegacyForwardIterator
및
ConstexprIterator
(C++26부터)
이며
value_type
을 가리킴
|
const_iterator
|
LegacyForwardIterator 및 ConstexprIterator (C++26부터) 이며 const value_type 을 가리킴 |
local_iterator
|
카테고리, 값, 차이, 포인터 및 참조 형식이
iterator
와 동일한 반복자 형식.
이 반복자는 단일 버킷 내에서는 순회할 수 있지만 버킷 간에는 순회할 수 없음 |
const_local_iterator
|
카테고리, 값, 차이, 포인터 및 참조 형식이
const_iterator
와 동일한 반복자 형식.
이 반복자는 단일 버킷 내에서는 순회할 수 있지만 버킷 간에는 순회할 수 없음 |
node_type
(C++17부터)
|
컨테이너 노드를 나타내는 node handle 의 특수화 |
insert_return_type
(C++17부터)
|
node_type
삽입 결과를 설명하는 형식으로,
template
<
class
Iter,
class
NodeType
>
|
멤버 함수
unordered_set
을 생성합니다
(public member function) |
|
unordered_set
을 소멸시킵니다
(public member function) |
|
|
컨테이너에 값을 할당합니다
(public member function) |
|
|
할당자 반환
(public member function) |
|
반복자 |
|
|
시작 부분에 대한 반복자를 반환합니다
(public member function) |
|
|
끝을 가리키는 반복자를 반환합니다
(public member function) |
|
용량 |
|
|
컨테이너가 비어 있는지 확인합니다
(public member function) |
|
|
원소의 개수를 반환합니다
(public member function) |
|
|
가능한 최대 원소 개수를 반환합니다
(public member function) |
|
수정자 |
|
|
내용을 지웁니다
(public member function) |
|
|
요소를 삽입합니다
또는 노드
(C++17부터)
(public member function) |
|
|
(C++23)
|
요소 범위를 삽입합니다
(public member function) |
|
제자리에서 요소를 생성합니다
(public member function) |
|
|
힌트를 사용하여 제자리에서 요소를 생성합니다
(public member function) |
|
|
요소들을 삭제함
(public member function) |
|
|
내용을 교환합니다
(public member function) |
|
|
(C++17)
|
컨테이너로부터 노드를 추출합니다
(public member function) |
|
(C++17)
|
다른 컨테이너로부터 노드를 연결합니다
(public member function) |
조회 |
|
|
특정 키와 일치하는 요소의 수를 반환합니다
(public member function) |
|
|
특정 키를 가진 요소를 찾습니다
(public member function) |
|
|
(C++20)
|
특정 키를 가진 요소가 컨테이너에 포함되어 있는지 확인합니다
(public member function) |
|
특정 키와 일치하는 요소들의 범위를 반환합니다
(public member function) |
|
버킷 인터페이스 |
|
|
지정된 버킷의 시작 부분에 대한 반복자를 반환합니다
(public member function) |
|
|
지정된 버킷의 끝을 가리키는 반복자를 반환합니다
(public member function) |
|
|
버킷 수를 반환합니다
(public member function) |
|
|
최대 버킷 수를 반환합니다
(public member function) |
|
|
특정 버킷의 요소 수를 반환합니다
(public member function) |
|
|
특정 키에 대한 버킷을 반환합니다
(public member function) |
|
해시 정책 |
|
|
버킷당 평균 요소 수를 반환합니다
(public member function) |
|
|
버킷당 최대 평균 요소 수를 관리합니다
(public member function) |
|
|
지정된 최소 버킷 수를 예약하고 해시 테이블을 재생성합니다
(public member function) |
|
|
지정된 수의 요소에 대한 공간을 예약하고 해시 테이블을 재생성합니다
(public member function) |
|
관찰자 |
|
|
키를 해시하는 데 사용되는 함수를 반환합니다
(public member function) |
|
|
키 동등 비교에 사용되는 함수를 반환합니다
(public member function) |
|
비멤버 함수
|
(C++11)
(C++11)
(removed in C++20)
|
unordered_set의 값을 비교함
(함수 템플릿) |
|
(C++11)
|
std::swap
알고리즘을 특수화함
(함수 템플릿) |
|
(C++20)
|
특정 조건을 만족하는 모든 요소를 삭제함
(함수 템플릿) |
추론 가이드 |
(C++17부터) |
참고 사항
멤버 타입
iterator
와
const_iterator
는 동일한 타입의 별칭(alias)일 수 있습니다. 이는 두 타입을 매개변수 타입으로 사용하는 함수 오버로드 쌍을 정의하는 것이
One Definition Rule
을 위반할 수 있음을 의미합니다.
iterator
는
const_iterator
로 변환 가능하므로, 대신
const_iterator
를 매개변수 타입으로 갖는 단일 함수를 사용하면 작동합니다.
| 기능 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_lib_containers_ranges
|
202202L
|
(C++23) | 컨테이너를 위한 범위 생성 및 삽입 |
__cpp_lib_constexpr_unordered_set
|
202502L
|
(C++26) |
constexpr
std::unordered_set
|
예제
#include <iostream> #include <unordered_set> void print(const auto& set) { for (const auto& elem : set) std::cout << elem << ' '; std::cout << '\n'; } int main() { std::unordered_set<int> mySet{2, 7, 1, 8, 2, 8}; // int 세트 생성 print(mySet); mySet.insert(5); // 세트에 요소 5 삽입 print(mySet); if (auto iter = mySet.find(5); iter != mySet.end()) mySet.erase(iter); // iter가 가리키는 요소 제거 print(mySet); mySet.erase(7); // 요소 7 제거 print(mySet); }
가능한 출력:
8 1 7 2 5 8 1 7 2 8 1 7 2 8 1 2
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 2050 | C++11 |
reference
,
const_reference
,
pointer
및
const_pointer
의 정의가
allocator_type
을 기반으로 함
|
value_type
및
std::allocator_traits 를 기반으로 함 |
참고 항목
|
(C++11)
|
키로 해시된 키들의 컬렉션
(클래스 템플릿) |
|
키로 정렬된 고유 키들의 컬렉션
(클래스 템플릿) |
|
|
(C++23)
|
컨테이너를 적응시켜 키로 정렬된 고유 키들의 컬렉션을 제공
(클래스 템플릿) |