2026-03-13(금) std::pair, map, stable_sort

조범근·2026년 3월 13일

TIL

목록 보기
18/25

C++ Week 3

map과 pair의 차이, stable_sort에 대해 알아보자

Study

알고리즘 2문제, 과제 3번, 1, 2장 생성자와 소멸자


Today I Learned


1. std::map과 std::pair의 차이

Reason

std::map는 중복된 KEY를 사용하지 못하지만, std::pair는 중복된 KEY도 사용 가능
std::map은 출력할때도 map.firstmap.second지만
std::pairpair[i].name_, pair[i].age_이런식으로 가독성이 좀 더 좋음

std::map은 그럼 pair의 하위호환이니까 잘 안 쓰겠네 ?

이렇게 생각했지만 잘 생각해보면, const쓰는 이유랑 비슷하다고 생각했다.
std::map중복된 KEY없이 VALUE를 할당하겠다는 선언이다.





2. sort와 stable_sort

Reason

std::sort를 사용하게 되면 연산되는 값이 같으면 마음대로 앞뒤로 바꾼다. bool compare 함수에서 값이 같을때를 if로 처리해서 true로 하게 만든다면 sort는 똑같은 값을 계속 true로하면서 무한루프에 빠지게 됨.

왜 무한루프에 빠질까? true면 다음꺼랑 또 비교하려 넘어가면 되는데?

sort에서 묻는다
"A < B일때 true야?" "어 true야" 라고답했다면 sort는 다음으로 간다
"그럼 A > B일때는 false겠네?" "아니 그것도 true야" 이렇게 되는것

즉,sort는 ==인 상태를 체크하지않는다.

Key Point

  • compare은 기본 상황을 true로 하는게 올바름



3. Human human01 = Human();과 Human human01;의 차이점이 뭐고 왜 굳이 이렇게 쓸까?

Reason

생성자의 초기화리스트를 꼼꼼하게 작성했다면, 짧은 Human human01;을 써도 상관은 없다.
그럼에도 불구하고 = Human();을 쓰는 이유는

  1. 쓰레기 값(Garbage Value) 방지
    Human human01;`은 만약 실수로 생성자를 정의하지 않았거나, 생성자 내에서 특정 멤버 변수를 초기화 리스트에서 빼먹었다면 메모리에 남아있던 지저분한 값이 그대로 들감
  1. 값 초기화의 보장
    확실하게 생성자를 짰다는 확신이 있어도 습관적으로 = Human();처럼 명시적으로 초기화 해주는 것이 방어적 프로그래밍 관점에서 권장됨.

결론은 초기화 리스트를 잘 썻다면 기능상 차이는 없으나 혹시 모른다는 것이 프로그래밍에서는 좋은 습관임

= Human();은 초기화리스트 값이 없는데 어떤 값으로 초기화 된다는걸까

일단 생성자가 없을때 Human()을 쓰면 기본 생성자를 자동으로 만들어 줌

- 기본 타입(int, float, bool 등) -> 0(또는 false, null)으로 싹 밀어버림

- 포인터 타입 -> `nullptr`로 초기화

- 다른 클래스 객체 멤버 -> 그 클래스의 생성자를 호출

복습

  • 참조(&) -> 자료형& 참조명 = 변수명;

    1. 하나의 변수에 참조를 여러개 만들어도 됨
    2. null 대입 불가능 = 없는 사람한테 별명을 붙일 순 없기때문
    3. 선언과 동시에 반드시 초기화 되어야만함.
    4. 참조하는 대상을 바꿀 수 없음. 값 복사는 가능

0개의 댓글