내일배움캠프🔥/퀘스트✔️

[ 내일배움캠프 ] 3. 템플릿 및 STL

pseonu 2025. 1. 3. 19:58

3️⃣ 필수 기능 가이드

  • 클래스의 이름은 SimpleVector라고 합니다.
  • 타입에 의존하지 않고 데이터를 받을수 있는 배열을 멤버변수로 갖습니다.
  • 생성자는 아래와 같이 구현 합니다.
    • 기본 생성자는 크기가 10인 배열을 만듭니다.
    • 숫자를 하나 받는 생성자는 해당 숫자에 해당되는 크기의 배열을 만듭니다.
  • 아래와 같은 멤버함수를 구현 합니다.
    • push_back 인자로 받은 원소를 맨 뒤에 추가 합니다. 반환값은 없습니다. 배열의 크기가 꽉 찼는데 원소가 더 들어올경우 아무 동작도 하지 않습니다.
    • pop_back은 벡터의 마지막 원소를 제거 합니다. 만약 제거할 원소가 없다면 아무 동작도 하지 않으며, 인자 및 반환값은 없습니다.
    • size는 인자가 없고 현재 원소의 개수를 반환합니다.
    • capacity 현재 내부 배열의 크기를 반환합니다.

4️⃣ 도전 기능 가이드

필수 기능을 모두 완료한 후, 아래 기능을 추가 합니다.

  • 복사 생성자를 구현 합니다.
  • 아래 멤버함수를 추가로 변경/구현 합니다.
    • push_back에서 배열의 크기가 꽉 찼는데 원소가 더 들어올경우, 기존 배열보다 크기를 5만큼 더 늘리고 새로운 원소까지 추가됩니다.(기존에 있던 값도 유지되야 합니다.)
    • resize는 정수 하나를 인자로 받습니다. 해당 정수가 현재 배열의 크기보다 작으면 아무 동작도 하지 않습니다. 만약 현재 배열보다 크기가 크면 해당 값만큼 크기를 재할당 합니다.(기존 원소는 그대로 있어야 합니다.)
    • sortData는 내부 데이터를 정렬하는 함수 입니다. 직접 정렬하지 않고 STL의 sort함수를 활용해서 정렬 합니다.

 

//심플 벡터 만들기

#include <iostream>
#include <algorithm>
using namespace std;
template <typename T>
class SimpleVector {
private:
    T* data;
    int currentSize; //현재 원소 갯수
    int currentCapacity; // 최대 길이
    void resize(int newCapacity) {//프라이빗 함수
        T* newdata = new T[newCapacity]; //최대길이+5의 길이인 새로운 배열 생성

        for (int i = 0; i < currentSize; i++) {//기존배열 복사해오기
            newdata[i] = data[i];
        }

        delete[] data;//기존 배열 삭제
        data = newdata;//배열 업데이트
        currentCapacity = newCapacity;//사이즈 업데이트
    }
public:
    SimpleVector() {
        data = new int[10];
    }
    SimpleVector(int capacity) {
        data = new int[currentCapacity];
    }

    ~SimpleVector() {
        delete[] data;
    }

    void push_back(const T& value) {
        if (currentSize >= currentCapacity) {
            resize(currentCapacity+5);
        }
        data[currentSize] = value;
        currentSize++;
    }

    void pop_back() {
        if (currentSize <= 0) {
            cout << "제거 할 원소 없음" << endl;
        }
        else
            currentSize--;
    }

    int size() {
        return currentSize;
    }

    int capacity() {
        return currentCapacity;
    }
    void sortData() {
        sort(data, data + currentSize);
    }

    const T& operator[](int index) const {
        return data[index];
    }
};

int main() {
    // SimpleVector<int>의 기본 생성자 사용
    SimpleVector<int> vec;
   
    // 요소 추가 (push_back)
    while(1){
        
        cout << "요소를 추가하세요 0을 누르면 중단합니다" << endl;
        int num = 0;
        cin >> num;
        
        vec.push_back(num);

        if (num == 0) {
            break;
        }
    }
    // 현재 크기와 용량 출력
    cout << "Size: " << vec.size() << endl;
    cout << "Capacity: " << vec.capacity() << endl;

    // 데이터 정렬
    cout << "vec: ";
    for (int i = 0; i < vec.size(); i++) {
        cout << vec[i] << " ";
    }
    cout << endl;

    vec.sortData();

    cout << "orting: ";
    for (int i = 0; i < vec.size(); i++) {
        cout << vec[i] << " ";
    }
    cout << endl;

    // 마지막 요소 제거
    vec.pop_back();
    cout << "pop_back: ";
    for (int i = 0; i < vec.size(); i++) {
        cout << vec[i] << " ";
    }
    cout << endl;
    return 0;
}