[TIL] 2025-12-18 | 과제3 구현 및 vector 동작 원리 이해

2025. 12. 18. 18:14·내배캠Unreal_TIL/C++
게임 개발자를 위한 C++ 문법 과제 3

1. WHY

  • 동적 메모리 할당과 해제를 직접 관리하며, C++ STL 컨테이너 중 vector의 핵심 동작 원리를 이해

 

2. WHAT

✏️ 자료구조 선택 가이드 

 

 

- copy()

배열 복사 함수

copy(oldArr first, oldArr last, newArr first);
//oldArr을 복사해서 newArr에 넣는다


3. HOW

1단계 요구사항 분석 및 설계

문제를 읽고 자신이 구현할 class의 구조를 설계하고, 어떤 부분에 템플릿을 적용해야 하는지 정리해보세요.

T* pItems_
: 아이템 객체들을 저장할 동적 배열을 가리키는 포인터입니다. new T[] 를 통해 메모리를 할당받습니다.

-> 첨에 벡터를 써야하는 문제인줄 알고 고민을 많이 했는데 동적 배열을 할당해서 포인터로 동적배열을 관리하는 거였다!

pItems_ = new T[capacity_];

확실히 허허벌판에 직접 코드를 작성하니 동적 배열 할당과 해제에 익숙해진 것 같다 bbb

 

2단계 코드 작성 및 구현

설계한 내용을 바탕으로 코드를 구현해보세요 기능을 완료하는 것도 중요하지만 내가 구현한 class를 실제 사용시 혼란을 주거나 불편함을 주는 경우가 없는지 고려해보세요. 만약 그렇다는 생각이 든다면 1단계로 다시 돌아가서 설계를 수정한 후에 다시 구현하는걸 추천 합니다.

 

3단계 테스트 및 디버깅

일단 기본기능이 잘 동작하는지 확인하는 것은 기본 입니다. 템플릿이 적용될 때 특정 타입에 문제가 있는 경우는 없는지, 메모리 누수가 발생하는 경우는 없는지 꼼꼼하게 확인해보세요 구현 뿐 아니라 예외를 고민하는 과정도 아주 중요합니다.

잘 돌아가는지 테스트. 

 

가만 생각해보니 Resize할 때 예외 처리를 안했다. 이 상태라면 기존 아이템 갯수보다 더 작게 할 시 오류날 것이 분명하다.

 

오류는 안나고 그냥 Resize()와 printAllItems()를 건너뜀..; 메모리가 꼬이나보다.

테스트해보니 Resize()안에서 메모리를 건들기 전까지는 작동함!

암튼 예외 처리를 해준다.

 

size_(아이템 갯수) 만큼 copy를 하기 때문에 newCapacity > size_일 때만 작동하도록 수정하겠다.

4. FIX

문제 없는데 경고 뜨는 경우

빌드 -> 솔루션 정리 / 빌드 -> 솔루션 다시 빌드

 

5. RESULT

  • 도전 실습

1. 성급을 기준으로 내림차순

2. 각성을 기준으로 내림차순 정렬

3. 레벨을 기준으로 내림차순 정렬

4. 예외처리: 위의 세 기준이 모두 동일할 경우, id를 기준으로 오름차순 정렬

#include <iostream>
#include <vector>
#include <string>
#include <algorithm> // std::sort 포함
using namespace std;

// 캐릭터 데이터 구조체
struct Character
{
    int id;         // 고유 식별자 (ID)
    int starRank;   // 성급
    int awakening;  // 각성 단계
    int level;      // 레벨

    void print() const
    {
        cout << "ID: " << id << " 성급: " << starRank;
        cout << " 각성: " << awakening << " Lv: " << level << endl;
    }
};

bool compareCharacters(const Character& a, const Character& b)
{
    if (a.starRank == b.starRank) {
        if (a.awakening == b.awakening) {
            if (a.level == b.level) {
                return a.id < b.id;
            }
            return a.level > b.level;
        }
        return a.awakening > b.awakening;
    }
    return a.starRank > b.starRank;
}

int main()
{
    vector<Character> characters =
    {
        {101, 5, 3, 50},
        {102, 5, 3, 70},
        {103, 5, 3, 70},
        {104, 4, 5, 99}
    };

    cout << "--- 정렬 전 ---" << endl;
    for (const auto& c : characters)
    {
        c.print();
    }

    sort(characters.begin(), characters.end(), compareCharacters);

    cout << "--- 정렬 후 ---" << endl;
    // 예상 결과: ID 102, 103, 101, 104 순으로 출력되어야 합니다.
    for (const auto& c : characters)
    {
        c.print();
    }

    return 0;
}

 

  • 과제 3

https://github.com/yoonseo4343/NBC_Cpp_P3

 

GitHub - yoonseo4343/NBC_Cpp_P3: 내일배움캠프 언리얼7기 과제 3

내일배움캠프 언리얼7기 과제 3. Contribute to yoonseo4343/NBC_Cpp_P3 development by creating an account on GitHub.

github.com

 

6. 참고

https://sanghyu.tistory.com/83

 

[C++ STL] queue(큐)

큐(queue) 큐 한쪽 끝에서 자료를 넣고 반대 쪽 끝에서 자료를 꺼낼 수 있는 선입선출(FIFO, First In First Out)의 속성을 지닌다. (동적배열(vector)의 경우 맨 끝에서 자료를 넣는 것이 유사하지만 맨 앞

sanghyu.tistory.com

https://viyoung.tistory.com/103

 

[c++] 배열을 복사하는 함수 (copy)

일단, memcpy함수는 algorithm에 존재하므로 사용하기 위해서는 상단부에 #include 을 반드시 적어야 한다. 일차원 배열일 경우에는 되게 단순하게 하면 된다. copy(복사할 배열의 시작지점, 복사할 배열

viyoung.tistory.com

 

 


배열(Array)과 벡터(vector)의 차이점

  • 배열은 고정 크기, 크기 변경 불가능
  • 벡터는 동적 크기, 크기 변경 가능 -> push_back, resize
  • 벡터는 at()을 사용하여 범위 검사 등 다양한 멤버 함수 제공

 

반복자(Iterator)란?

  • 컨테이너의 원소를 순차적으로 접근하기 위한 포인터와 유사한 객체

 

vector<>와 map<>의 용도

  • 벡터: 순서 중요, 빠른 접근
  • 맵: 키-값 매핑, 자동 정렬(이진 탐색 트리 구조)

 

map vs. unordered_map

  • 사용하는 알고리즘
    • map → 이진 탐색 기반
    • unordered_map → 해시 함수 기반
  • 기능 & 속도 차이
    • unordered_map이 대부분 더 빠름
    • map은 순서 보장 + 안정성
  • 순회 결과가 다른 이유
    • map: 트리 구조 → 정렬된 상태 유지
    • unordered_map: 해시 버킷 구조 → 저장 순서 무작위

 

vector<>::reserve()의 용도

  • 미리 메모리를 확보 -> 재할당 방지
  • push_back -> 재할당 + 복사 비용 발생
  • reserve() -> 성능 최적화
vector<int> v;
v.reserve(100);

for (int i = 0; i < 100; i++)
    v.push_back(i);

잡담.

잠깐동안 왜 안되는지 고민했음..^^;

'내배캠Unreal_TIL > C++' 카테고리의 다른 글

[TIL] 2025-12-19 | 과제4 구현  (0) 2025.12.19
[C++] STL 총정리  (0) 2025.12.18
[TIL] 2025-12-17 | C++ 예외 처리, 연산자 오버로드, 객체지향적 설계  (0) 2025.12.17
[TIL] 2025-12-16 | C++ STL, vector, map, sort(), find(), Iterator  (2) 2025.12.16
[TIL] 2025-12-15 | C++ 스마트 포인터, 템플릿  (0) 2025.12.15
'내배캠Unreal_TIL/C++' 카테고리의 다른 글
  • [TIL] 2025-12-19 | 과제4 구현
  • [C++] STL 총정리
  • [TIL] 2025-12-17 | C++ 예외 처리, 연산자 오버로드, 객체지향적 설계
  • [TIL] 2025-12-16 | C++ STL, vector, map, sort(), find(), Iterator
윤윤씨
윤윤씨
🎮 내일배움캠프 Unreal 7기
  • 윤윤씨
    컴퓨터온열맛사지
    윤윤씨
  • 전체
    오늘
    어제
    • 분류 전체보기 (62)
      • 내배캠Unreal_TIL (62)
        • C++ (23)
        • UE (31)
        • 팀프로젝트 (7)
      • etc (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Github
    • Solved.ac
    • YouTube
  • 태그

    디자인패턴
    챌린지
    STL
    언리얼과제
    ta
    머티리얼
    코드카타
    gas
    프로그래머스
    오토마타
    스테이트머신
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.6
윤윤씨
[TIL] 2025-12-18 | 과제3 구현 및 vector 동작 원리 이해
상단으로

티스토리툴바