std::unique가 있다는 걸 알았고 compare이 생각보다 많이 까다롭다는 걸 알음
C++ 문법 끝, 알고리즘 2문제
sort함수는 기본적으로 누가 더 작은가를 묻기 때문에 5와 5를 비교할때
"5가 5보다 작냐?" 라고 물으면 대답은 아니오(false)여야 하기때문이다.
문자열도 마찬가지로 "apple"이 "apple"보다 작냐고 물으면 false라고 답해야 ,
sort 알고리즘이 "아, 둘은 순서가 상관이없구나"라고 이해하고 안정적으로 동작한다.
만약, 여기서 ture라고 답하면 알고리즘이 혼란에 빠져 메모리 오류를 낼 수 있음
bool compareDistance(const string& a, const string& b) {
if (a.length() != b.length()) {
return a.length() < b.length(); // 1순위: 길이 비교
}
return a < b; // 2순위: 길이가 같으면 "사전 순" 비교 (내부에서 for문 돌림)
}
return a < b를 했을때 자연스럽게 생각해보면 a랑 b만 string 문자열 자체에서 a랑 b를 비교해줄꺼라고 생각이되는데 이게 어떻게 성립이 되는걸까?
일단 결론은 이미 string 내부에 string끼리 비교할때 사전 순 비교 함수를 실행해야지~
하고 알아서 char 단위 비교를 자동으로 해줌
a < b이면 컴퓨터가 a[0] < b[0], a[1] < b[1]... 이런 식
const string& a에서 const는 수정하지않겠다.인데 왜 수정하기 위해서 값을 참조(&)하는걸까?정답은 '복사'와 '참조'에 있음. 값을 복사하는 것과 참조하는 것은 속도가 다르다.
sort하려면 compareDistance 함수를 수만번, 수십만번 호출해야하는데 계속 값을 복사하면 엄청 느려짐
string은 부등호를 알아서 char문자로 비교해줌word.erase(unique(word.begin(), word.end()), word.end());
알고리즘 문제를 풀다가 알고리즘에서 std::unique와 std::unique_ptr가 다르다는 것을 알게됨
std::unique_ptr(스마트 포인터)메모리 관리 도구. 특정 객체의 소유권을 단 한명만 가질 수 있게 보장하는 포인터 객체지향 설계나 메모리 누수 방지 이야기를 할 때 주로 등장함.
std::unique(알고리즘 함수)
<algorithm>헤더에 들어있는 데이터 처리 함수.역할 : 컨테이너(vector, erase 등)에서 연속적으로 중복된 원소를 뒤로 밀어버리는 일을 함
특징 : 배열의 내용을 정리해 주는 함수
word.erase(unique(word.begin(), word.end()), word.end());
->
unique(word.begin(), word.end())는 중복된 것을 뒤로 밀고
->
word.erase(뒤로 민 것의 시작점, word.end());로 삭제