map과 pair의 차이, stable_sort에 대해 알아보자
알고리즘 2문제, 과제 3번, 1, 2장 생성자와 소멸자
std::map는 중복된 KEY를 사용하지 못하지만, std::pair는 중복된 KEY도 사용 가능
std::map은 출력할때도 map.first와 map.second지만
std::pair는 pair[i].name_, pair[i].age_이런식으로 가독성이 좀 더 좋음
std::map은 그럼 pair의 하위호환이니까 잘 안 쓰겠네 ?이렇게 생각했지만 잘 생각해보면, const쓰는 이유랑 비슷하다고 생각했다.
std::map은 중복된 KEY없이 VALUE를 할당하겠다는 선언이다.
std::sort를 사용하게 되면 연산되는 값이 같으면 마음대로 앞뒤로 바꾼다. bool compare 함수에서 값이 같을때를 if로 처리해서 true로 하게 만든다면 sort는 똑같은 값을 계속 true로하면서 무한루프에 빠지게 됨.
sort에서 묻는다
"A < B일때 true야?" "어 true야" 라고답했다면 sort는 다음으로 간다
"그럼 A > B일때는 false겠네?" "아니 그것도 true야" 이렇게 되는것
즉,
sort는 ==인 상태를 체크하지않는다.
생성자의 초기화리스트를 꼼꼼하게 작성했다면, 짧은 Human human01;을 써도 상관은 없다.
그럼에도 불구하고 = Human();을 쓰는 이유는
- 쓰레기 값(Garbage Value) 방지
Human human01;`은 만약 실수로 생성자를 정의하지 않았거나, 생성자 내에서 특정 멤버 변수를 초기화 리스트에서 빼먹었다면 메모리에 남아있던 지저분한 값이 그대로 들감
- 값 초기화의 보장
확실하게 생성자를 짰다는 확신이 있어도 습관적으로= Human();처럼 명시적으로 초기화 해주는 것이 방어적 프로그래밍 관점에서 권장됨.
결론은 초기화 리스트를 잘 썻다면 기능상 차이는 없으나 혹시 모른다는 것이 프로그래밍에서는 좋은 습관임
= Human();은 초기화리스트 값이 없는데 어떤 값으로 초기화 된다는걸까일단 생성자가 없을때 Human()을 쓰면 기본 생성자를 자동으로 만들어 줌
- 기본 타입(int, float, bool 등) -> 0(또는 false, null)으로 싹 밀어버림
- 포인터 타입 -> `nullptr`로 초기화
- 다른 클래스 객체 멤버 -> 그 클래스의 생성자를 호출
참조(&) -> 자료형& 참조명 = 변수명;