본문 바로가기

VEDA 복습/C, C++

VEDA 13일차 - C++

반응형

 

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