전체 코드


📌 1. STL(Standard Template Library)이란?

  • STL(Standard Template Library): C++에서 자료구조와 알고리즘을 제공하는 라이브러리
  • 컨테이너(Container): 데이터를 저장하는 객체 (예: vector, list, map)
  • 반복자(Iterator): 컨테이너의 요소를 순회하는 기능
  • 알고리즘(Algorithm): 정렬, 탐색 등의 기능 제공

📂 2. 벡터(Vector)란?

  • 동적 배열(Dynamic Array)로 크기가 자동으로 조절됨
  • 크기를 미리 지정할 필요 없이 push_back()을 통해 요소를 추가 가능
  • 연속된 메모리 블록을 사용하여 배열처럼 동작
  • 크기가 증가할 때 여유 공간을 미리 할당하여 성능 최적화

🔥 3. 벡터(Vector)의 기본 사용법

벡터 선언 및 사용

#include <vector>  // STL 벡터 사용을 위한 헤더 파일 포함
#include <iostream>

using namespace std;

int main()
{
    vector<int> v;  // 정수형 벡터 선언
    v.push_back(1); // 요소 추가
    v.push_back(2);
    v.push_back(3);

    cout << "Vector size: " << v.size() << endl;  // 현재 요소 개수 출력

    return 0;
}

push_back(value): 벡터의 끝에 value 추가
size(): 현재 저장된 요소 개수 반환


🔍 4. 벡터(Vector)의 메모리 관리

벡터의 크기 (size())와 용량 (capacity())

vector<int> v;

for (int i = 0; i < 10; i++) {
    v.push_back(i);
    cout << "Size: " << v.size() << ", Capacity: " << v.capacity() << endl;
}

size() → 실제 저장된 요소 개수
capacity() → 내부적으로 할당된 메모리 크기
capacity()는 1.5배~2배씩 증가하면서 재할당됨.


🎯 5. 벡터의 삽입과 삭제

벡터의 앞, 뒤에서 삽입/삭제

vector<int> v;
v.push_back(10);  // 끝에 삽입
v.pop_back();     // 끝에서 삭제

push_back(value): 벡터 뒤에 요소 추가
pop_back(): 벡터 마지막 요소 제거


벡터의 중간 삽입 및 삭제

vector<int> v = {1, 2, 3, 4, 5};

// 중간에 100 삽입
vector<int>::iterator it = v.begin() + 2;
v.insert(it, 100);

// 중간 요소 삭제
v.erase(v.begin() + 2);

insert(position, value): 특정 위치에 요소 추가
erase(position): 특정 위치의 요소 삭제


🚀 6. 벡터(Vector)의 메모리 최적화

1) reserve()로 용량 미리 설정

vector<int> v;
v.reserve(1000);  // 미리 1000개의 공간 할당 (성능 향상)

reserve(n): 용량을 미리 할당하여 메모리 재할당을 방지


2) clear()swap()으로 메모리 해제

vector<int> v = {1, 2, 3, 4, 5};
v.clear();  // 모든 요소 제거 (size = 0, capacity 유지)

// 메모리까지 초기화
vector<int>().swap(v);  // 빈 벡터와 swap하여 capacity도 0으로 설정

clear(): 요소만 삭제 (capacity는 유지)
swap(): 빈 벡터와 교체하여 메모리까지 해제


🔄 7. 벡터(Vector)와 반복자(Iterator)

반복자(Iterator) 사용법

vector<int> v = {10, 20, 30, 40, 50};

// 일반 반복자
vector<int>::iterator it;
for (it = v.begin(); it != v.end(); ++it) {
    cout << *it << " ";  // 10 20 30 40 50
}

begin() → 첫 번째 요소 가리킴
end() → 마지막 요소 다음 위치 가리킴
*it → 반복자가 가리키는 요소 값 접근


역방향 반복자 (reverse_iterator)

vector<int>::reverse_iterator rit;
for (rit = v.rbegin(); rit != v.rend(); ++rit) {
    cout << *rit << " ";  // 50 40 30 20 10
}

rbegin()마지막 요소부터 시작
rend()첫 번째 요소 이전까지


🚀 8. 벡터(Vector)의 임의 접근

벡터는 배열처럼 인덱스로 접근 가능

vector<int> v = {10, 20, 30, 40, 50};

cout << v[2] << endl;  // 30
cout << v.at(2) << endl;  // 30 (예외 처리 O)

v[i]빠르지만 예외 처리를 하지 않음
v.at(i)안전하지만 예외 처리를 포함


🚀 9. 사용자 정의 벡터(Vector) 클래스

사용자 정의 Vector 클래스 구현

template<typename T>
class MyVector {
private:
    T* data;
    int size;
    int capacity;

public:
    MyVector() : size(0), capacity(1) {
        data = new T[capacity];
    }

    ~MyVector() {
        delete[] data;
    }

    void push_back(const T& val) {
        if (size == capacity) {
            reserve(capacity * 2);
        }
        data[size++] = val;
    }

    void reserve(int newCapacity) {
        if (newCapacity <= capacity) return;
        T* newData = new T[newCapacity];
        for (int i = 0; i < size; i++) {
            newData[i] = data[i];
        }
        delete[] data;
        data = newData;
        capacity = newCapacity;
    }

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

    int getSize() const { return size; }
    int getCapacity() const { return capacity; }
};

사용자 정의 벡터를 통해 STL vector와 유사한 동작 구현


profile
李家네_공부방

0개의 댓글