C++ 문법 & const, set (2025.06.30)

이정국(PBD)·2025년 6월 30일

TIL

목록 보기
21/69

*오늘 학습 내용*

C++ 정렬 / Auto, Swap

1.코드카타 문제풀이(49)
2.C++ 기본 개념
3.기타 함수

✅ 1. const와 포인터의 위치별 의미 정리

🔹 핵심 개념

  • const 위치에 따라 보호 대상이 달라짐
선언의미보호 대상
int* ptr일반 포인터없음
const int* ptr값을 못 바꿈값 보호
int* const ptr주소를 못 바꿈주소 보호
const int* const ptr"둘 다 못 바꿈값 + 주소 보호
*예시코드
int a = 10, b = 20;
const int* p1 = &a;   // *p1 = 20; ❌
int* const p2 = &a;   // p2 = &b; ❌
const int* const p3 = &a; // 모두 불가

✅ 요약
*const → 값 보호
*const → 주소 보호

✅ 2. std::sort() 함수 문법

std::sort(start, end); // 기본 문법
std::sort(start, end, compareFunc); // 커스텀 함수도 가능
std::sort(v.begin(), v.end(), desc); // 내림차순
  • ✅ 요약
    정렬 범위는 [시작, 끝)
    비교함수는 bool func(T a, T b) 형태로 작성

✅ 3. std::vector 슬라이싱(부분 복사) 방법 정리

*슬라이싱 문법
std::vector<int> sub(v.begin() + startIndex, v.begin() + endIndex);

**주의: endIndex는 포함 안 됨 → [start, end) 구조

*슬라이싱 예시코드
std::vector<int> array = {10, 20, 30, 40, 50};
std::vector<int> sub(array.begin() + 1, array.begin() + 4); // 20~40

✅ 요약
begin() + i, begin() + j는 슬라이싱 범위의 핵심
끝 인덱스는 포함되지 않음 (, j까지 포함하려면 begin() + j까지)

✅ 4. std::sort(v)가 안 되는 이유

🔹 이유
→ std::sort()는 vector 자체를 받지 않고, 반복자 2개를 인자로 받음

✅ 올바른 예
std::sort(v.begin(), v.end()); // 올바른 문법

❌ 잘못된 예
std::sort(v); // ❌ 컴파일 에러

✅ 요약
std::sort는 반드시 반복자 2(begin(), end())가 필요하다

✅ 5. push_back(iterator)가 안 되는 이유와 *iterator 사용

🔹 핵심 차이

  • iterator 자체는 포인터 같은 역할
  • *iterator는 실제 값을 의미함
❌ 잘못된 예
v.push_back(vec.begin() + 2); // ❌ iterator는 int 아님

✅ 올바른 예
v.push_back(*(vec.begin() + 2)); // ✅ 역참조로 값 넣기

✅ 요약
vector.push_back()은 값(int)을 넣어야 함
반복자 넣고 싶다면 반드시 *로 역참조해서 값 꺼내야 함

✅ 6. std::set 정리 (중복 제거 + 정렬 자동)

6-1. std::set vs std::vector 차이

항목std::setstd::vector
중복❌ 자동 제거⭕ 허용
정렬자동 오름차순❌ 수동 정렬 필요
접근 방식인덱스 없음인덱스로 접근 가능

6-2. 주요 문법

std::set<int> set;

set.insert(3);   // 값 추가
set.insert(3);   // 중복 무시
set.erase(3);    // 삭제
set.find(5);     // 탐색

*정렬 + 중복 제거를 자동으로 처리*

for (int num : set) 로 순회 가능

6-3. std::set → std::vector 변환

*생성자 방식 (가장 간단)*
std::set<int> set = {3, 1, 2};
std::vector<int> vec(set.begin(), set.end());

*std::copy 방식*
std::vector<int> vec;
std::copy(set.begin(), set.end(), std::back_inserter(vec));

✅ 요약
std::set은 자동 정렬 + 중복 제거가 필요한 경우 최고의 선택
벡터로 변환 시 set.begin(), set.end() 범위로 복사하면 끝!

✅ 7. size_t란 무엇이며 int와의 차이점

* 정의
size_t는 양수 전용 정수형
배열, 벡터 크기나 인덱스 표현에 적합

비교

항목intsize_t
부호있음없음(=unsigned)
크기보통 4바이트플랫폼에 따라 다름
음수표현 가능❌ 표현 불가

✅ 요약
STL에서 .size(), .length() 등의 결과는 전부 size_t
음수 필요 없으면 size_t 쓰는 게 안정적이고 표준적임.

✅ 8. Undefined Behavior vs Unspecified Behavior

항목Undefined Behavior(UB)Unspecified Behavior(USB)
정의 여부❌정의 안 됨⭕정의는 되지만 방식은 다양함
예측가능 여부❌예측 불가, 결과 무한대⭕결과는 있음, 순서만 불확실
대표 예시x = x++ (시퀀스 충돌)f(a(), b()) (누가 먼저?)
위험도💥매우 위험 (터질 수 있음)😕덜 위험하지만 주의 필요

✅ 요약
UB는 하면 안 되는 것 → 결과 보장 안 됨
USB는 여러 방식 중 하나 → 결과는 정해짐, 순서만 애매

profile
창백한 푸른점 속 작은점

0개의 댓글