*오늘 학습 내용*
C++ 정렬 / Auto, Swap
1.코드카타 문제풀이(49)
2.C++ 기본 개념
3.기타 함수
✅ 1. const와 포인터의 위치별 의미 정리
🔹 핵심 개념
| 선언 | 의미 | 보호 대상 |
|---|
| int* ptr | 일반 포인터 | 없음 |
| const int* ptr | 값을 못 바꿈 | 값 보호 |
| int* const ptr | 주소를 못 바꿈 | 주소 보호 |
| const int* const ptr | "둘 다 못 바꿈 | 값 + 주소 보호 |
*예시코드
int a = 10, b = 20;
const int* p1 = &a;
int* const p2 = &a;
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);
✅ 요약
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);
✅ 올바른 예
v.push_back(*(vec.begin() + 2));
✅ 요약
vector.push_back()은 값(int 등)을 넣어야 함
반복자 넣고 싶다면 반드시 *로 역참조해서 값 꺼내야 함
✅ 6. std::set 정리 (중복 제거 + 정렬 자동)
6-1. std::set vs std::vector 차이
| 항목 | std::set | std::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는 양수 전용 정수형
배열, 벡터 크기나 인덱스 표현에 적합
비교
| 항목 | int | size_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는 여러 방식 중 하나 → 결과는 정해짐, 순서만 애매