——— STD (std::) ———

<iterator>

#include <iterator>
// 벡터의 처음과 끝 사이의 거리 계산
std::vector<int> numbers = {1, 2, 3, 4, 5};
int dist = std::distance(numbers.begin(), numbers.end());
std::cout << "벡터의 크기: " << dist << std::endl;

/*-- Allocator 할당자 --*/ // 메모리할당방식을 세팅
Allocator::allocate(); // Wrappered, operator new 
Allocator::deallocate(); // Wrappered, operator delete

// 커스텀할당자의 필요성
1. 메모리파편화문제 해결 // 메모리할당해제의 높은반복빈도로 가용메모리의 파편화를 방지하기위해 하나의 메모리풀을 한타입 객체로 만들어 관리
2. 운영체제종속적 공유메모리 사용 // 해당공유메모리에 직접 접근하여 사용하려할때 (WinRegistry를 mfcMethod가 아니라 포인터로 접근하려할때)

/*-- IteratorAdapter 반복자어답터 --*/ //
// 역방향반복자: std::forward_list, 비순차연관컨테이너제외 전부지원 with rbegin(), rend()
std::reverse_iterator 
for (auto it = collection.rbegin(); it != collection.rend(); ++it) {}

.base();//현재 반복자를 순방향으로 바꾸고 다음 위치를 반환(하나빼줘야함, rbegin() rend()는 역방향반복자 리턴 → 순방향 바꿔줘야 호환됨)
std::vector<int> vec;
int nTarget;
std::vector<int>::iterator itForward = std::find(vec.begin(), vec.end(), nTarget)
std::vector<int>::reverse_iterator itReverse = std::find(vec.rbegin(), vec.rend(), nTarget)
if (itForward == itReverse.base() - 1) {
	std::cout << "순방향이터의 인덱싱 ["<< itForward - vec.begin() << "]는 " << std::endl; // iter는 -begin()하면 인덱싱, 안하면 기계주소임
	std::cout << "역방향이터.base() - 1의 인덱싱 [" << itReverse.base() - 1 - vec.begin() << "]와 같다." << std::endl;
}

////---> 스트림반복자: 
// 기본 ostream, istream을 추상화하여, 하위의 다른 std::출력스트림들과 호환되게 하는 것이 포인트
// 하위상속과 비교이해가 중요 → ex: std::ostream ⊃ cout, ofstream, ostringstream 등
std::ostream_iterator<T>(std::ostream& os); // 두가지생성자존재, operator<< 지원
std::ostream_iterator<T>(std::ostream& os, const char* delimiter);
std::istream_iterator(); // 입력스트림과 연결되지않은 반복자, 스트링끝 표시에 사용
std::istream_iterator(std::istream& is); // 입력데이터 읽기용

// example1 : comparision
#include <iostream>
std::vector<int> vec = {1, 2, 3, 4, 5};
for (const auto& element : vec) { // 벡터의 각 요소를 출력
    std::cout << element << " "; 
}

#include <iostream>
#include <iterator>
std::vector<int> vec = {1, 2, 3, 4, 5};
std::ostream_iterator<int> oi(std::cout, " ");
for (const auto& element : vec) { // 벡터의 각 요소를 oi에 전달(출력)
    *oi = element;
    ++oi;  // 다음 위치로 이동
}

// example2 : usage
std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));
	

////---> 삽입반복자:
// 반복자라는 추상대상을 통해 다양한 컨테이너에 공통적용가능
// 반복자조작을 통해, 기존배열에 삽입하는 상황에서 조건을 설정 (중간삽입, 뒤삽입, 앞삽입)
std::insert_iterator<Container>(Container& c, typename Container::iterator idx);
std::back_insert_iterator<Container>(Container& c); 
std::front_insert_iterator<Container>(Container& c);

// 함수지원
std::inserter(Container& c, typename Container::iterator idx); // 주로 vector, set, unordered_set, map, unordered_map과 사용 (지정위치에 요소를 삽입)
std::back_inserter(Container& c); // 주로 vector, list 와 사용 (끝에 요소를 빠르게 삽입할수 있는)
std::front_inserter(Container& c); // 주로 deque, list 와 사용 (시작에 요소를 삽입)

// example1 : 100인 항목목 복사대상에서 지우면서 복제, → 출력
std::vector<int> vec1, vec2;
std::fill(vec1.begin(), vec1.end(), 123);

case 변수사용:
	std::back_insert_iterator<std::vector<int>> vec2IterBackInsert(vec2);
	std::remove_copy_if(vec1.begin(), vec1.end(), vec2IterBackInsert, [](int i){ return i == 100; });
case 함수사용:
	std::remove_copy_if(vec1.begin(), vec1.end(), std::back_inserter(vec2), [](int i){ return i == 100; });
case 연관컨테이너에 변경알고리즘적용: // 수정하면서 순회 (삽입반복자의 최대 혜택, 연관컨테이너 insert(반복자)등 메서드지원)
	std::remove_copy_if(vec1.begin(), vec1.end(), std::inserter(vec2, vec2.begin()), [](int i){ return i == 100; });

std::copy(vec2.begin(), vec2.end(), std::ostream<int>(std::cout, " ")); // 출력

////---> 이동반복자:
/* std::move_iterator의 역참조연산자는 역참조된 값을 자동으로 lvalue우측값참조로 변환
	 오버헤드없는 대입 인자로 사용 가능 (단 해당객체가 이동시멘틱을 지원해야함) */

to Top

STL

| Container

자료구조의 기술기반과 개념도

자료구조의 기술기반과 개념도

<aside> 🖼️

컨테이너

[표준 C++컨테이너] // STL : 8개 + 4개(C++11)
/* 연관 vs 비연관 : key-value구조면 → 연관
 * 순차 vs 비순차 : 정렬 혹은 순서유지시 → 순차 */

/* 기술적으로 볼때 queue, prioriry_queue, stack컨테이너는 컨테이너-어뎁터에 불과하고, 
   array, vector, deque, list, forward_list같은 표준 순차 컨테이너에 인터페이스를 덧씌워서 만듦
 * 연관컨테이너는 서로 비슷한 삽입-삭제-접근 성능제공
 * set / map은 key-value쌍으로 저장하기에 (정렬된) 연관컨테이너로 분류, set은 값자체가 키역할
   map은 key값을 문자열이나 여러 클래스타입들로 등록해서 연관-배열AssociativeArray를 구현가능
 * undered_set, undered_map, undered_multiset, undered_multimap은 비순차 연관컨테이너이다
   다른 말로 '헤시테이블' 이라고도 한다. */

#include <interator> /*C++98*/
5가지 타입존재, 정규화된 클래스계층X, 타입체크X, 구속력없는 기능상 계층구조만 존재
InputIterator/OutputIterator ← ForwardIterator ← BidirectionalIterator ← RandomaccessIterator

auto 키워드로 컨테이너.begin()등의 이터레이터를 받으면, 자동으로 일반 이터레이터가 받아져서 
읽기쓰기가 모두 가능해진다. 방지하려만 .cbegin(), cend()로 이터레이터를 받자

일반적으로 이터레이터의 안정성은 포인터정도 수준, 즉 굉장히 위험함

랜덤액세스기능(숫자를 이용한 인덱싱접근): 이터레이터에 +n 식으로 인덱싱 점프하는 기능, 
소속 컨테이너가 랜덤액세스가 가능한 경우만 iter도 가능

vector는 그렇지 않지만 list(:인덱싱은 내부적으로 순서카운트를 역참조가 포함되어 오버헤드있음), 
map/set(:애초에 비순차컨테이너라 순차순회 자체가 불가능)은 iterator로 순회하는게 더 빠름

element를 add 하는 상황에서 reallocation발생으로 capacity가 증가하게되면 
이전까지 선언된 iterator는 모두 무효화되어 쓰레기값에 접근함
template <typename T> void RoundRobin<T>::add(const T& elem) {
  int pos = mIterCurElem - mElem.begin(); // 이터레이터 쓸꺼면 저장관리해줘야함
  push_back(elem);
  mIterCurElem = mElem.begin() + pos;
} // erase의 경우는 좀 더 까다로움, 앞삭제/뒷삭제 경우의 수 + 삭제elem까지 반복순회하면서 조정해줘야함

<.end()는 .begin()과 같이 사용되어야함>
std::vector<int> vec = {1, 2, 3};
auto it = vec.end();
int value = *it; // Undefined behavior

“ *는 전통적인의미의 STL 표시 ... // StandardTemplateLibrary(템플릿기반의 자료구조'컨테이너'와 '알고리즘’)

| c스타일배열 type [] | STL container는 아님 포인터가 반복자와 동일하게 작동하며 동일한 역할, size() erase() empty() 같은 stl함수는 지원 x stl컨테이너와 일정부분 호환된다. ex) 벡터에 이어붙이기 vec.insert(vec.end(), carr, carr+10); | | --- | --- | | <string> = 순차컨테이너
| 엄밀히 말해 STL container는 아님 - util소속, 하지만 지원함수는 벡터와 상당히 유사 begin(), end(), insert(), push_back(), erase(), size(), empty(), reserve(), capacity()지원 string/wstring은 basic_string 탬플릿을 char, wchar_t로 인스턴스화 한 것

※다른 여러 util메서드와 friend메서드를 제공한다는 점은 다소 어수선함 | | <stream> = 저장x , 과거관점상 컨테이너x,  | istream_iterator, ostream_iterator 등 제공으로 순회 지원 | | <stack> * = 단방향 삽입삭제

 | ~ 클래스 템플릿 : 선입후출 또는 후입선출(엘리베이터)

ex에러처리모듈 stack의 헤더 template<Class T, Class Cotainer = std::deque<T>> class stack; //vector, list도 가능 push(), emplace(), pop(), top(), empty(), size(), swap() | | <queue> 어댑터 * = 단방향 삽입삭제 (개념상 콤팩트deque) '반복자제공X'

 | ~ & priority_queue 클래스 템플릿 : 선입선출(선착순) 단방향큐(vs deque)

유사한 삽입성능 / 더빠른 삭제-복잡도O(1) #priority_queue : 우선순위큐, 우선순위를 고려한 선입선출, 예외가 있는 대기열 모델 push(), emplace(), pop(), front(), back(), size(), empty(), swap() 이 전부

우선순위큐의 헤더 template<Class T, Class Cotainer = std::vector<T>, Class Compare = std::less<T>>; vector대신 deque도 사용가능 랜덤액세스 안되는 list는 불가, less<T>는 T타입을 비교할 수 있게함 push(), emplace(), pop()삭제, top()프론트(무조건const), 끝항목조회x, size(), empty(), swap(), 비교연산자 지원x | | <deque> 순차 * = 양방향삽입삭제

디폴트생성사: 모든비트를 0초기화, 0/1문자열 string타입에 대한 생성자 지원, cout << 등의 스트림입출력연산자로 객체를 스트리밍가능 set(), reset(), flip(), operator[], test() //해당인덱스비트의 셋 여부 리턴 모든종류의 비트연산지원: & | ^ ~ << >> &= |= ^\ <<= >>= ...// ^ == XOR(), ~(a & b) == NAND()

NAND gate is fundamental, why? NOT(a) == NAND(a, a) AND(a, b) == NOT(NAND(a, b)) OR(a, b) == NAND(NOT(a), NOT(b)) XOR(a, b) == NAND( NAND(a, NAND(a, b), NAND(b, NAND(a, b))) ) // NOT(AND) NOR(a, b) == NAND( NAND(a, a), NAND(b, b) ) // NOT(OR)

ex) 케이블티비회사의 고객-구독채널map typedef std::map<std::string customerName, std::bitset<kNumChannels>> sbMap; sbMap mPackages, mCustomers; // 패키지 이름으로 채널조합이 있고, 고객 이름으로 구독중인-채널조합이 있다. // 고객명단에 고객이름 + 채널번호/채널묶음bitset/패키지명 으로 추가삭제가 가능하고 // 패키지명단에 별도의 채널조합을 추가삭제가 가능하다. | | <list> 순차 * = 삽입삭제특화

<링크구조를 살린 기능들> == O(1) listA.splice(itA, listB) : 다른listB를 통째로 listA의 특정위치에 삽입, listB는 삽입후 삭제됨 listA.splice(itA, listB, itB) : listB의 특정원소를 삽입 listA.splice(itA, listB, sttB, endB) : listB의 특정범위를 삽입 오버라이딩of특별성능inSTL : remove(), remove_if(), unique(), merge(), sort(), stable_sort(), reverse() | | <set> 연관 * = 전방위삽입삭제/검색 + 3특성

 | ~ & multiset 클래스 템플릿 : 수학의 집합개념(단 인덱싱이 있다는 점이 유일하게 다름)

균형이진검색트리로 구현, 중복허용없는 정렬된 컨테이너 삽입삭제/검색-복잡도O(logn), vector < 삽입삭제속도 < list, vector > 검색속도 > list ex대형서점의 재고관리 (재고목록의 최신화가 빈번하고 검색도 빈번함)

(vs deque)성능포지션상 deque와 비교됨, 주요 차이점 : 1.중복원소 허용X.. 2.항상정렬상태유지.. 3.작은 오버헤드... 총평 : 주요차이점 3가지에 특화가 필요하지 않다면 deque가 대부분 더 빠르다 O(1~n), 중간에서의 삽입삭제 경우는 O(n)있을 수 있음, set은 성능을 조금 포기하고 성능분포를 고르게 가져간 느낌(특화성능vs평탄성능) count(키) : 존재여부, 개수 체크하는 가장 간단한 방법 → int contains(키) : 존재여부 → bool // cpp20

multiset : 중복허용set 특수화지원 find() | | <map> 연관 * = set의 key-value버전 (set은 key '= value;)

 | ~ & multimap 클래스 템플릿 : key-value구조의 set (값이 아닌 key를 기준으로 정렬유지)

균형이진검색트리로 구현, 중복허용없는 정렬된 컨테이너 (set과 완벽히 동일한 성능) 삽입삭제/검색-복잡도O(logn), vector < 삽입삭제속도 < list, vector > 검색속도 > list ex서점의 책을 ISBN코드로 관리 할 수 있다. std::map<키타입, 값타입, 비교타입=less, 할당자타입=default> 유니폼초기화 지원 특수화지원 find() insert()->pair<it대상위치, bool삽입결과> operator[key] = 값 →항상 성공, 비존재-키접근시 디폴트생성자 호출(무조건 객체생성, 비효율, const함수아님), 키존재시 [], 비존재시 find()→iter(비존재시.end()반환) 접근필요 operator[]는 항상 non-const함수임→const맵으로 접근하면 애러 → const맵은 find()로 접근 non-const반복자로 접근하더라도 키를 수정할 순 없음(정렬깨짐) count(키) : 존재여부, 개수 체크하는 가장 간단한 방법 → int contains(키) : 존재여부 → bool // cpp20 erase : 키-버전, 범위-버전 지원

multimap : 중복가능 operator[] 미제공, insert()항상성공->iter바로 리턴, 중복예외적용원할시 별도의 체크로직 추가해야 find() 작동은 하지만 중복중 몇번째인지 보장x →같은키 항목순회지원(일종의 필터기능): lower_bound()첫번째항목iter, upper_bound()마지막항목다음iter equal_range()->pair<lowerIt, upperIt> (map에서도 지원되지만 효용성 떨어짐) | | <vector> 순차 * = 누적삽입삭제

vector<bool> : 비트필드 // 내부적으로는 기본타입bool 자체가 아니라 wrapperClass로 작동한다(대리자 디자인패턴/매게클래스) .flip() 비트뒤집기 | | <array> 순차 * = C스타일 정적배열 | /* C++11 */ ~ 클래스 템플릿 : 크기가 고정된 C스타일 정적배열의 ref+a 오버헤드X, 자동포인터변환X, 반복자제공, std::vector와 매우 유사, 정적이란 점이 다름, fill() 지원 동적배열의 clear(), resize(), reserve(), insert(), erase(), push_back(), pop_back()등은 지원 x | | <forward_list> 순차 * = 삽입삭제특화

구조: key기반 해시함수 결과에 따라 bucket에 저장(vs 각 노드는 최대 2개의 자식가진 트리) 특성: 해시함수가 데이터를 균일하게 분포 유지(vs 트리가 균형되도록 삽입삭제시 자동 재구성) 시간복잡도: 삽입삭제/검색 O(평균1~충돌시n)(vs 모든 연산logn) 장점: 매우빠른 검색속도, key-value쌍 관리(vs 데이터 정렬유지, 범위쿼리등 특정 연산에 강함) 해쉬충돌시→2차함수재해싱/리니어체이닝(일반적)→충돌줄이는 가장쉬운방법 해쉬테이블사이즈키우기 count(키) : 존재여부, 개수 체크하는 가장 간단한 방법 → int* /* C++20 / contains(키) : 존재여부 → bool / C++20 */ 투명연산자 지원 → C++20 이전에는 std::unordered_map<std::string, ...>에서find("key")는 std::string 객체를 인자로 받아야 했음, 만약 std::string_view를 넘기면, 암시적 변환이 일어나서 std::string 객체가 만들어졌음(비효율적). | | <unordered_map> 비순차연관 * = 고성능, 해쉬테이블

 | /* C++11 */ ~ & unordered_multimap 클래스 템플릿

이름처럼 개념상으로는 정렬되지 않는 map과 정확히 같지만 실제 구현방식은 '해시테이블'로 되어있어 특성과 성능은 판이함 구조: key기반 해시함수 결과에 따라 bucket에 저장(vs 각 노드는 최대 2개의 자식가진 트리) 특성: 해시함수가 데이터를 균일하게 분포 유지(vs 트리가 균형되도록 삽입삭제시 자동 재구성) 시간복잡도: 삽입삭제/검색 O(평균1~충돌시n)(vs 모든 연산logn) 장점: 매우빠른 검색속도, key-value쌍 관리(vs 데이터 정렬유지, 범위쿼리등 특정 연산에 강함) 해쉬충돌시→2차함수재해싱/리니어체이닝(일반적)→충돌줄이는 가장쉬운방법 해쉬테이블사이즈키우기 count(키) : 존재여부, 개수 체크하는 가장 간단한 방법 → int /* C++20 / contains(키) : 존재여부 → bool / C++20 */ 투명연산자 지원 → C++20 이전에는 std::unordered_map<std::string, ...>에서find("key")는 std::string 객체를 인자로 받아야 했음, 만약 std::string_view를 넘기면, 암시적 변환이 일어나서 std::string 객체가 만들어졌음(비효율적).

template<class 키타입, class 값타입, class 해쉬타입=hash<키타입>, class 등호비교타입=std::equal_to<키타입>, class 할당자타입=std::allocator<std::pair<const 키타입, 값타입>>> 유니폼초기화 지원 ex: 전화번호부 사람이름-전화번호

<map>: bucket()버킷인덱스리턴, bucket_count()컨테이너의 전체버킷개수, bucket_size(), load_factor()버킷당저장된평균항목개수(얼마나많은키충돌있나), max_bucket_count(), max_load_factor(), rehash(), reserve() <unordered_map>: crbegin(), crend(), lower_bound(), upper_bound(), rbegin(), rend() <공통>: iterator, local_iterator개별버킷내부를 순회하는 반복자

unordered_multimap : 중복허용(랜덤액세스[]지원x) 해쉬테이블 equal_range()같은키모든값순회하는반복자페어리턴->pair<stt_Iter, end_Iter> | | <utility>

 | std::pair<a, b> : make_pair() 지원, 비교연산 == < 등 지원, 포인터인입시주의 → 복제/대입연산자는 얕은 복사

|

| 함수명(~cpp17) | 반환 타입(리턴 타입) | vector | deque | list | forward _list | array | string | set | multiset | map | multimap | unordered _set | unordered _multiset | unordered _map | unordered _multimap | stack | queue | priority _queue | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | | .begin() | iterator (const_iterator for const 객체) | O | O | O | O | O | O | O | O | O | O | O | O | O | O | x | x | x | | .end() | iterator (const_iterator for const 객체) | O | O | O | O | O | O | O | O | O | O | O | O | O | O | x | x | x | | .cbegin() | const_iterator | O | O | O | O | O | O | O | O | O | O | O | O | O | O | x | x | x | | .cend() | const_iterator | O | O | O | O | O | O | O | O | O | O | O | O | O | O | x | x | x | | .rbegin() | reverse_iterator (const_reverse_iterator for const 객체) | O | O | O | x | O | O | O | O | O | O | O | O | O | O | x | x | x | | .rend() | reverse_iterator (const_reverse_iterator for const 객체) | O | O | O | x | O | O | O | O | O | O | O | O | O | O | x | x | x | | .crbegin() | const_reverse_iterator | O | O | O | x | O | O | O | O | O | O | O | O | O | O | x | x | x | | .crend() | const_reverse_iterator | O | O | O | x | O | O | O | O | O | O | O | O | O | O | x | x | x | | .size() | size_type (보통 std::size_t) | O | O | O | x | O | O | O | O | O | O | O | O | O | O | O | O | O | | .max_size() | size_type (보통 std::size_t) | O | O | O | O | O | O | O | O | O | O | O | O | O | O | O | O | O | | .empty() | bool | O | O | O | O | O | O | O | O | O | O | O | O | O | O | O | O | O | | .front() | reference (const_reference for const 객체) | O | O | O | O | O | O | x | x | x | x | x | x | x | x | O | O | x | | .back() | reference (const_reference for const 객체) | O | O | O | x | O | O | x | x | x | x | x | x | x | x | O | x | x | | .at(size_type) | reference (const_reference for const 객체) | O | x | x | x | O | O | x | x | x | x | x | x | x | x | x | x | x | | .operator[](size_type) | reference (const_reference for const 객체) | O | x | x | x | O | O | x | x | x | x | x | x | x | x | x | x | x | | .push_back(value_type) | void | O | O | O | x | x | O | x | x | x | x | x | x | x | x | x | x | O | | .pop_back() | void | O | O | O | x | x | O | x | x | x | x | x | x | x | x | x | x | O | | .push_front(value_type) | void | x | O | O | O | x | x | x | x | x | x | x | x | x | x | O | O | x | | .pop_front() | void | x | O | O | O | x | x | x | x | x | x | x | x | x | x | O | O | x | | .emplace_back(args...) | reference (C++20부터), 그 전에는 void | O | O | O | x | x | O | x | x | x | x | x | x | x | x | x | x | O | | .emplace_front(args...) | reference (C++20부터), 그 전에는 void | x | O | O | O | x | x | x | x | x | x | x | x | x | x | O | O | x | | .insert(...) | iterator (삽입된 위치; unordered 계열은 pair<iterator,bool> 등 반환) | O | O | O | O | x | O | O | O | O | O | O | O | O | O | x | x | x | | .insert_or_assign(key, obj) | pair<iterator, bool> (map, unordered_map 계열) | x | x | x | x | x | x | x | x | O | x | x | x | O | x | x | x | x | | .emplace(...) | iterator (unordered 계열은 pair<iterator,bool> 등 반환) | O | O | O | O | x | O | O | O | O | O | O | O | O | O | x | x | x | | .try_emplace(...) | pair<iterator, bool> (map, unordered_map 계열) | x | x | x | x | x | x | x | x | O | x | x | x | O | x | x | x | x | | .erase(...) | iterator (삭제 후 다음 위치, 일부는 void) | O | O | O | O | x | O | O | O | O | O | O | O | O | O | x | x | x | | .clear() | void | O | O | O | O | O | O | O | O | O | O | O | O | O | O | x | x | x | | .swap(container&) | void | O | O | O | O | O | O | O | O | O | O | O | O | O | O | x | x | x | | .assign(...) | void | O | O | O | x | x | O | x | x | x | x | x | x | x | x | x | x | x | | .resize(size_type) | void | O | O | O | x | x | O | x | x | x | x | x | x | x | x | x | x | x | | .shrink_to_fit() | void | O | O | x | x | x | O | x | x | x | x | x | x | x | x | x | x | x | | .reverse() | void | x | x | O | O | x | x | x | x | x | x | x | x | x | x | x | x | x | | .sort() | void | x | x | O | x | x | x | x | x | x | x | x | x | x | x | x | x | x | | .merge(container&) | void | x | x | O | O | x | x | O | O | O | O | x | x | x | x | x | x | x | | .unique() | void | x | x | O | O | x | x | x | x | x | x | x | x | x | x | x | x | x | | .splice(...) | void | x | x | O | O | x | x | x | x | x | x | x | x | x | x | x | x | x | | .remove(value_type) | void | x | x | O | O | x | x | x | x | x | x | x | x | x | x | x | x | x | | .remove_if(predicate) | void | x | x | O | O | x | x | x | x | x | x | x | x | x | x | x | x | x | | .find(key_type) | iterator (없으면 end()) | x | x | x | x | x | x | O | O | O | O | O | O | O | O | x | x | x | | .count(key_type) | size_type | x | x | x | x | x | x | O | O | O | O | O | O | O | O | x | x | x | | .equal_range(key_type) | pair<iterator, iterator> | x | x | x | x | x | x | O | O | O | O | O | O | O | O | x | x | x | | .lower_bound(key_type) | iterator | x | x | x | x | x | x | O | O | O | O | x | x | x | x | x | x | x | | .upper_bound(key_type) | iterator | x | x | x | x | x | x | O | O | O | O | x | x | x | x | x | x | x | | .bucket_count() | size_type (unordered 계열) | x | x | x | x | x | x | x | x | x | x | O | O | O | O | x | x | x | | .load_factor() | float (unordered 계열) | x | x | x | x | x | x | x | x | x | x | O | O | O | O | x | x | x | | .rehash(size_type) | void (unordered 계열) | x | x | x | x | x | x | x | x | x | x | O | O | O | O | x | x | x | | .reserve(size_type) | void (vector, deque, string, unordered 계열 등) | O | O | x | x | x | O | x | x | x | x | O | O | O | O | x | x | x | | .capacity() | size_type (vector, deque, string, array 등) | O | O | x | x | x | O | x | x | x | x | x | x | x | x | x | x | x | | .c_str() | const char* (string 계열) | x | x | x | x | x | O | x | x | x | x | x | x | x | x | x | x | x | | .top() | reference (const_reference for const 객체; stack, priority_queue) | x | x | x | x | x | x | x | x | x | x | x | x | x | x | O | x | O | | .push(value_type) | void (stack, queue, priority_queue) | x | x | x | x | x | x | x | x | x | x | x | x | x | x | O | O | O | | .pop() | void (stack, queue, priority_queue) | x | x | x | x | x | x | x | x | x | x | x | x | x | x | O | O | O |