2025.12.17

박민재 (Daype)·2025년 12월 17일

2025.12.17 요약노트

2-2 template

함수 오버로딩

  • C언어와는 달리 cpp 언어에선 동일한 이름의 함수를 여러개 정의할 수 있다. cpp는 함수의 이름뿐만 아니라 매개변수와 타입정보를 함께 사용하기때문
    - 함수 이름을 구분하기위해 "내부적으로" '고유' 한 이름을 부여하는것을 네임 맹글링 이라고 한다. 단, 함수의 반환형을 바꾸는것만으론 오버로딩이 되지 않 는다.
    - 매개변수가 다른경우
    - 매개변수의 개수가 다른경우
    ★ 각 함수가 "명확히" 구분되어야 함

  • 함수가 오버로딩이 되려면 호출되는 함수가 명확해야한다.

함수 오버로딩의 순서
cpp 에서는 아래와 같은 명확한 우선순위 규칙에 따라서 호출할 함수를 결정함.
- [정확한 매칭 -> 타입 승격 변환 -> 표준 타입 변환 -> 사용자 정의 타입 변환]
- 정확한 매칭) : 타입이 정확히 일치하는지 확인
- 타입 승격 변환) : 일치하는 타입이 없다면 그다음으로 값이 손실되지 않는 방향으로 변환
- 표준 타입 변환) : 일치하는 타입이 없고 값이 손실되지 않는 방향도 없다면 값 손실을 감수하고 변환
- 사용자 정의 타입 변환) : 클래스 타입의 변환 함수나 생성자 등을 통해 이뤄지는 변환 NOT YET

템플릿

Template 로 정의
- 메서드의 타입을 T로 정의 해놓으면 int 형이든 double형이든 하나의 템플릿으로 정의가 가능

템플릿 클래스

template 을 사용하여 함수를 구현했을때 T add() 라고 가정하자 이때
T add(const T& a, const T& b) 이렇게 매개변수를 정하게되면
main 함수에서 호출할때 add(10, 20) 이렇게 값만 넘겨주는게 가능하게 되는데
그 이유는 원래라면 &는 참조자로 기본값을 가지고 있어야만 가능하다 단, template 에서 매개변수에 const를 선언하게되면 [C++ 설계자들은 "임시 값이라도 읽기 전용으로만 쓴다면 참조를 허용해주자"라는 예외 규칙을 만들었습니다] 해당 예외 규칙이 존재하기 때문에 변수를 선언하지 않고 그냥 값을 넘겨 줄 수 있다는 것을 알게되었다.


2-3 STL 기초

표준 템플릿 라이브러리

표준 : c++ 에서 기본적으로 제공
템플릿 : 데이터에 의존 x

STL 은 3가지 : 컨테이너, 알고리즘, 반복자

컨테이너 : 데이터를 담은ㄴ것
알고리즘 : 동작
반복자 : 컨테이너와 알고리즘에대해서 세부사항을 몰라도 동일하게 사용할 수있게해주는 문법

컨테이너 : 데이터를 담는 자료구조

  • 템플릿으로 구현되어있음
  • 메모리관리를 내부적으로 할 수 있음 누수 걱정x
  • 대부분 컨테이너는 반복자를 제공함

벡터

  • 템플릿 클래스로 구현되어있다.
  • 내부 배열의 크기가 자동으로 조정 세부사항 고려 x 메모리관리자동
  • 배열과 유사함 임의 접근 가능 []배열첨자 연산자 사용가능 특정원소에 바로 접근 가능
  • 삽입 삭제는 맨 뒤에서 하는게 좋음 데이터가 선형적으로 저장되어있어 중간 삽입/삭제는 n개의 데이터를 뒤로 옮기는 연산을
    하게 될 수 있어서 맨뒤에 계속해서 추가하는 방식은 효율적이다 앞 중간은 벡터는 비효율 다른 컨테이너 사용 고려 내부가 배열과의 유사성

벡터의 선언

vector vec / vector vec2(크기, 원소값)
vector vec3 = {1,2,3,4,5} 초기화 리스트로 크기가5이며 순서대로 1,2,3,4,5 가 삽입됨 : 초기화 리스트 선언
vector vec4(vec3) 기존의 생성된 벡터의 복사본을 만듦 메모리는 독립적으로 잡히지만 값은 vec3와 동일 : 벡터 복사선언
vector vec2D(3, vector(4,7)) : 2차원배열 '처럼' 사용 3 == 행의갯수 배열과 동일하진않음 : 2차원배열처럼 사용하는 벡터

push_back : 벡터의 맨끝에 원소를 추가하는 메서드

pop_back : 맨끝에 원소를 제거하는 메서드

size : 현재 벡터의 크기를 확인하는 메서드

erase : 특정 구간의 원소를 제거하는 메서드 , 단, 벡터의 성능을 떨어뜨릴 수 있어서 되도록이면 사용 금지
vec.erase(vec.begin + 1) 0 1 2 == 1삭제
vec.erase(vec.begin + 1, vec.begin + 3) == a <= x < b x에 해당되는 값 전부 삭제

  • 특정 키를 사용하여 값을 검색하는 기능 ex) 친구이름으로 전화번호를 찾는것 [연관컨테이너라고함]
    pair<const key, Value> 형태로 저장

insert()

make_pair() 를 이용하여 pair 객체를 생성한 후 insert 함수를 사용할 수 있다. 또는 {} 나 [] 를 활용하여 값을 추가할 수도 있다.

find()

  • 이 메서드를 사용하면 특정키가 map 에 존재하는지 파악 할 수 있다.

알고리즘

sort () : 컨테이너의 내부를 정리하는 함수
사용자 정렬함수가 없다면 오름차순으로 장리
comp(a, b) 라고 가정했을때 첫번째 인자 a가 앞에원소를 의미 그리고 반환 타입은 bool
정렬함수 구현시 true 반환한다면 위에 순서를 그대로유지 false 라면 a와 b의 순서를 바꿈

컨테이너의 내부 구조는 서로 다르지만 대부분 알고리즘의 동일한 코드를 활용해서 사용할 수 있다.

find () : 컨테이너의 내부에서 특정원소를 찾아 해당원소의 '반복자' 를 반환

헷갈릴만한 요소 find() 메서드 사용시 두번째 인자를 전달할때 두번째 인자는 내가 찾을 범위의 다음위치를 넘겨야함
왜냐하면 못찾았을경우에 빈공간을 반환해야 하기 때문에 못찾았는데 마지막 값을 반환하면 파악하기 힘듦
find(a, b) a<= x < b 의구조

반복자

  • 순방향 반복자 : 앞에서부터 뒤로 순차적으로 순회하는 반복자

  • 역방향 반복자 : 마지막원소부터 첫번째원소까지 역순으로 순회하는 반복자
    rbegin 은 마지막원소 rend 는 첫번째원소 이전을 가리킴 rbegin <= x < rend 구조

0개의 댓글