C++ 표준 라이브러리
주요 기능 : 입출력, 문자열 처리, 컨테이너, 알고리즘, 기타 유틸리티, 헤더파일을 추가하는 것만으로 사용 가능
a.c -> a.o -> a.o + libc.a + (lib.o) + crt0.o -> a.exe
crt0.o : 메인 함수를 호출하기 전에 필요한 초기화를 수행하는 루틴의 집합
.a 파일 : 필요한 오브젝트 파일을 모아놓은 것
String 라이브러리 : <string>
length() : 문자열 길이 반환
size() : 메모리의 크기 반환
empty() : 문자열이 비어있으면 true, 아니면 false
append() : 문자열 추가
find() : 문자열 찾기(인덱스 반환)
compare() : 문자열 비교하여 0:같음, 양수:대상 문자열이 더 길거나, 일치하지 않는 첫 번째 문자가 더 큼, 음수 : 대상 문자열이 더 짧거나, 일치하지 않는 첫 번째 문자가 더 작음 -> 비교 연산자를 사용하는 것이 나음
replace() : 문자열의 일부를 다른 문자열로 교체
filesystem 파일 시스템 : <filesystem>
데이터의 저장과 관리를 도와주는 라이브러리
std::filesystem::path
- 파일 및 디렉터리 경로를 다루는 클래스
- 경로 문자열을 객체로 관리하며, 다양한 연산을 수행할 수 있음
- 주요 멤버 함수:
- string(), wstring(), u8string() → 경로를 문자열로 반환
- root_name(), root_directory(), parent_path() → 경로 구성 요소 추출
- filename(), extension(), stem() → 파일명 관련 기능 제공
- append(), concat(), replace_extension() → 경로 조작
std::filesystem::directory_entry
- 파일이나 디렉터리의 정보를 저장하는 클래스
- std::filesystem::directory_iterator와 함께 사용됨
- 주요 멤버 함수:
- path() → 해당 파일/디렉터리의 경로 반환
- is_directory(), is_regular_file() → 해당 경로가 디렉터리인지 파일인지 확인
- file_size(), last_write_time() → 파일 크기 및 마지막 수정 시간 가져오기
std::filesystem::directory_iterator
- 특정 디렉터리 내의 파일과 디렉터리를 순회하는 반복자
- 주요 기능:
- begin(), end()를 사용하여 범위 기반 for 루프에서 활용 가능
- *it로 directory_entry 반환
std::filesystem::recursive_directory_iterator
- 하위 디렉터리까지 재귀적으로 순회하는 반복자
- directory_iterator와 사용 방식이 유사
파일 및 디렉터리 조작
- exists(path) → 경로가 존재하는지 확인
- create_directory(path) → 디렉터리 생성
- create_directories(path) → 중간 경로까지 포함하여 디렉터리 생성
- remove(path) → 파일 또는 빈 디렉터리 삭제
- remove_all(path) → 경로 아래 모든 파일 및 디렉터리 삭제
- rename(old_path, new_path) → 파일/디렉터리 이름 변경 또는 이동
- copy(from, to, options) → 파일/디렉터리 복사
파일 정보 조회
- file_size(path) → 파일 크기 반환
- last_write_time(path) → 마지막 수정 시간 반환
- is_regular_file(path), is_directory(path), is_symlink(path) → 파일 유형 확인
경로 조작
- absolute(path) → 절대 경로 반환
- canonical(path) → 정규화된 절대 경로 반환
- relative(path, base) → 기준 경로를 기준으로 상대 경로 반환
그외의 라이브러리
<random>, <cmath> 등 그때 그때 찾아보면 된다.
컨테이너와 반복자
컨테이너: 같은 타입의 여러 객체를 저장할 수 있는 묶음 단위의 데이터 구조
반복자 : 컨테이너 내부 원소를 순회하는 객체
반복자(Iterator)
type::iterator it : 일종의 포인터처럼 동작, *로 참조
container.begin(), container.end() : 컨테이너의 시작과 끝을 가리킴
auto 변수 사용하면 쉽다.
vector 주요 함수
1. 벡터 생성 및 초기화
- 기본 생성자: 빈 벡터 생성
- 크기 지정 생성자: 특정 크기의 벡터 생성 (vector<int> vec(5);)
- 초기값 지정 생성자: 특정 값으로 초기화 (vector<int> vec(5, 10);)
- 리스트 초기화: 중괄호 {}를 이용한 초기화
- 벡터 복사 생성: 다른 벡터를 복사하여 생성
2. 원소 접근
- at(index): 범위 검사를 포함하여 요소에 접근
- operator[]: 범위 검사를 하지 않지만 빠른 접근 가능
- front(): 첫 번째 요소 반환
- back(): 마지막 요소 반환
3. 원소 수정
- push_back(value): 마지막에 요소 추가
- pop_back(): 마지막 요소 제거
- insert(position, value): 특정 위치에 요소 삽입
- erase(position): 특정 위치의 요소 삭제
- clear(): 모든 요소 제거
- resize(new_size, value): 크기 조절, 필요 시 새 요소를 특정 값으로 초기화
4. 크기 및 상태 확인
- size(): 현재 요소 개수 반환
- capacity(): 현재 할당된 용량 반환
- empty(): 벡터가 비어 있는지 확인
5. 정렬 및 탐색
- sort(begin, end): 오름차순 정렬
- sort(rbegin, rend): 내림차순 정렬
- find(begin, end, value): 특정 값 찾기
6. 메모리 관리
- shrink_to_fit(): 불필요한 용량 해제
- reserve(n): 메모리 용량을 미리 예약하여 성능 최적화
7. 반복자 사용
- begin(), end(): 기본 반복자 반환
- rbegin(), rend(): 역방향 반복자 반환
다른 컨테이너도 vector와 유사한 구조를 가진다.
List
노드 기반 데이터 저장, 메모리에 비연속적으로 저장 => 공간 활용은 좋으나 접근에 시간이 걸린다.
데이터의 삽입, 삭제가 쉽다.
1. 생성 및 초기화
- std::list<T> lst; → 빈 리스트 생성
- std::list<T> lst(n, val); → n개의 val로 초기화된 리스트 생성
- std::list<T> lst(iter1, iter2); → 다른 컨테이너의 구간 [iter1, iter2)을 복사하여 리스트 생성
2. 원소 추가
- push_back(val) → 리스트의 끝에 val 추가
- push_front(val) → 리스트의 앞에 val 추가
- emplace_back(val) → 끝에 val을 직접 생성하여 추가 (복사보다 빠름)
- emplace_front(val) → 앞에 val을 직접 생성하여 추가
- insert(iter, val) → iter 위치에 val 추가
- insert(iter, n, val) → iter 위치에 n개의 val 추가
- insert(iter, iter1, iter2) → 다른 컨테이너 구간 [iter1, iter2)을 iter 위치에 삽입
3. 원소 삭제
- pop_back() → 리스트의 마지막 원소 제거
- pop_front() → 리스트의 첫 번째 원소 제거
- erase(iter) → iter 위치의 원소 제거
- erase(iter1, iter2) → [iter1, iter2) 범위의 원소 제거
- clear() → 리스트의 모든 원소 제거
- remove(val) → val과 같은 모든 원소 제거
- remove_if(predicate) → 조건(predicate)을 만족하는 원소 제거
4. 크기 및 상태 확인
- size() → 리스트의 원소 개수 반환
- empty() → 리스트가 비어 있으면 true 반환
- max_size() → 리스트가 가질 수 있는 최대 크기 반환
5. 원소 접근
- front() → 첫 번째 원소 참조 반환
- back() → 마지막 원소 참조 반환
6. 정렬 및 순서 변경
- reverse() → 리스트의 원소 순서를 반대로 변경
- sort() → 리스트 정렬 (기본적으로 오름차순)
- sort(comp) → comp 비교 함수를 이용한 사용자 정의 정렬
- unique() → 연속된 중복 원소 제거
- unique(comp) → comp 조건에 따라 중복 원소 제거
- merge(lst2) → 정렬된 lst2를 현재 리스트에 병합 (둘 다 정렬되어 있어야 함)
- merge(lst2, comp) → 사용자 정의 비교 함수 comp를 사용하여 병합
7. 리스트 연산
- splice(iter, lst2) → lst2의 전체 원소를 iter 위치에 이동
- splice(iter, lst2, iter2) → lst2의 iter2 원소를 iter 위치로 이동
- splice(iter, lst2, iter1, iter2) → lst2의 [iter1, iter2) 범위를 iter 위치로 이동
- swap(lst2) → 현재 리스트와 lst2의 원소를 교환
8. 이터레이터
- begin() → 첫 번째 원소를 가리키는 이터레이터 반환
- end() → 마지막 원소의 다음 위치를 가리키는 이터레이터 반환
- rbegin() → 역순 첫 번째 원소를 가리키는 이터레이터 반환
- rend() → 역순 마지막 원소의 다음 위치를 가리키는 이터레이터 반환
Deque
큐와 스택이 합쳐져 있는 형태, 기본 골자는 List
기본적으로 List와 같은 함수를 공유한다.
연관 컨테이너
set, multiset, map, multimap
set : 내부적으로 정렬되어 있음, 오름차순, 이진 탐색 트리를 사용하여 원소를 저장 => 탐색에 유리
multiset : set과 유사하나 중복을 허용하지 않는 set과 다르게 중복을 허용, erase시 만족하는 모든 element 삭제
map : key-value 쌍을 저장하는 연관 컨테이너, 키 값이 고유값이다.
multimap : map과 유사, 단 key 값이 반드시 고유할 필요는 없다.
컨테이너 어뎁터
다른 커네이너를 기반으로 새로운 기능을 제공하는 컨테이너 ex) vector -> stack, queue -> deque
'VEDA 복습 > C, C++' 카테고리의 다른 글
VEDA 16일차 - Qt (0) | 2025.04.07 |
---|---|
VEDA 14일차 - C++ (0) | 2025.04.03 |
VEDA 12일차 - C++ (0) | 2025.04.01 |
VEDA 11일차 - C++ (0) | 2025.03.31 |
VEDA 10일차 - C++ (0) | 2025.03.28 |