2026-03-12(목) sort, compare, unique, erase

조범근·2026년 3월 12일

TIL

목록 보기
17/25

C++ Week 3

std::unique가 있다는 걸 알았고 compare이 생각보다 많이 까다롭다는 걸 알음

Study

C++ 문법 끝, 알고리즘 2문제


Today I Learned


1. sort에서 a == b일때 왜 반드시 false로 할까?

Reason

sort함수는 기본적으로 누가 더 작은가를 묻기 때문에 5와 5를 비교할때

"5가 5보다 작냐?" 라고 물으면 대답은 아니오(false)여야 하기때문이다.

문자열도 마찬가지로 "apple"이 "apple"보다 작냐고 물으면 false라고 답해야 ,
sort 알고리즘이 "아, 둘은 순서가 상관이없구나"라고 이해하고 안정적으로 동작한다.

만약, 여기서 ture라고 답하면 알고리즘이 혼란에 빠져 메모리 오류를 낼 수 있음

Key Point

  • compare은 기본적으로 true로 빠져나가는게 올바름




2. string 문자열의 자동 char 문자 비교

Problem

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를 했을때 자연스럽게 생각해보면 abstring 문자열 자체에서 ab를 비교해줄꺼라고 생각이되는데 이게 어떻게 성립이 되는걸까?

Reason

일단 결론은 이미 string 내부에 string끼리 비교할때 사전 순 비교 함수를 실행해야지~
하고 알아서 char 단위 비교를 자동으로 해줌

a < b이면 컴퓨터가 a[0] < b[0], a[1] < b[1]... 이런 식

const string& a에서 const는 수정하지않겠다.인데 왜 수정하기 위해서 값을 참조(&)하는걸까?

정답은 '복사'와 '참조'에 있음. 값을 복사하는 것과 참조하는 것은 속도가 다르다.
sort하려면 compareDistance 함수를 수만번, 수십만번 호출해야하는데 계속 값을 복사하면 엄청 느려짐

Key Point

  • string은 부등호를 알아서 char문자로 비교해줌
  • 참조를 값을 데이터 수정에 용이해서 이용하는 것 뿐만 아니라 복사의 비용때문에도 있음




3. std::unique와 std::unique_ptr

Problem

word.erase(unique(word.begin(), word.end()), word.end());
알고리즘 문제를 풀다가 알고리즘에서 std::uniquestd::unique_ptr가 다르다는 것을 알게됨

Reason

  1. std::unique_ptr (스마트 포인터)

메모리 관리 도구. 특정 객체의 소유권을 단 한명만 가질 수 있게 보장하는 포인터 객체지향 설계나 메모리 누수 방지 이야기를 할 때 주로 등장함.

  1. std::unique (알고리즘 함수)
    <algorithm> 헤더에 들어있는 데이터 처리 함수.

역할 : 컨테이너(vector, erase 등)에서 연속적으로 중복된 원소를 뒤로 밀어버리는 일을 함

특징 : 배열의 내용을 정리해 주는 함수

word.erase(unique(word.begin(), word.end()), word.end());
->
unique(word.begin(), word.end())는 중복된 것을 뒤로 밀고
->
word.erase(뒤로 민 것의 시작점, word.end());로 삭제

개념 정리

0개의 댓글