Ch 1. [STL] Vector

hyeony·2025년 1월 14일

OOP

목록 보기
1/4

1.1 What is Vector?

1.1.1 개념

std::vector은 C++ 표준 라이브러리(STL)에서 제공하는 동적 배열 자료구조이다.

1.1.2 특징

- 크기가 동적으로 조정됨
- 배열과 비슷하지만, 더 강력한 기능 제공
- 메모리 관리가 자동으로 이루어짐

1.1.3 사용 사례

- 요소의 개수를 미리 알 수 없는 데이터를 다룰 때
- 복잡한 메모리 관리를 피하고 싶을 때

1.2 Usage

1.2.1 Vector 선언 및 초기화

#include <vector>
using namespace std;

vector<int> v1;               // 비어 있는 벡터
vector<int> v2(5);            // 크기가 5인 벡터 (0으로 초기화)
vector<int> v3(5, 42);        // 크기가 5이고, 모든 요소가 42로 초기화
vector<int> v4 = {1, 2, 3};   // 초기화 리스트

1.2.2 기본 연산

- 요소 추가 및 삭제: push_back(), pop_back()
- 요소 접근: operator[], at()
- 크기 확인: size(), capacity(), resize()

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

v.push_back(4);									// 4 추가
v.pop_back();									// 마지막 요소 삭제
cout << v[0] << " " << v.at(0) << endl;			// 첫 번째 요소 출력
cout << v.size();								// 크기 출력

1.3 Vector의 주요 기능 및 메서드

1.3.1 크기와 용량

#include <iostream>
#include <vector>
using namespace std;

int main() {
    // 초기화된 벡터
    vector<int> v;

    // 1. 초기 상태
    cout << "Initial state:" << endl;
    cout << "Size: " << v.size() << ", Capacity: " << v.capacity() << endl << endl;

    // 2. reserve()로 용량 예약
    v.reserve(10);
    cout << "After reserve(10):" << endl;
    cout << "Size: " << v.size() << ", Capacity: " << v.capacity() << endl << endl;

    // 3. 요소 추가 및 size() 변화 확인
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    cout << "After adding 3 elements:" << endl;
    cout << "Size: " << v.size() << ", Capacity: " << v.capacity() << endl << endl;

    // 4. resize()로 크기 증가 (기본값으로 초기화)
    v.resize(6);
    cout << "After resize(6):" << endl;
    cout << "Size: " << v.size() << ", Capacity: " << v.capacity() << endl;
    cout << "Elements: ";
    for (int x : v) {
        cout << x << " "; // 기존 요소는 유지되고, 새로운 요소는 0으로 초기화됨
    }
    cout << endl << endl;

    // 5. resize()로 크기 감소
    v.resize(2);
    cout << "After resize(2):" << endl;
    cout << "Size: " << v.size() << ", Capacity: " << v.capacity() << endl;
    cout << "Elements: ";
    for (int x : v) {
        cout << x << " "; // 크기가 줄어들면서 뒤쪽 요소 삭제
    }
    cout << endl << endl;

    // 6. reserve()와의 차이 확인
    v.reserve(20);
    cout << "After reserve(20):" << endl;
    cout << "Size: " << v.size() << ", Capacity: " << v.capacity() << endl << endl;

    return 0;
}

1.3.2 삽입과 삭제

- 중간 삽입: insert()
- 특정 위치 삭제: erase()
- 모든 요소 삭제: clear()

#include <iostream>
#include <vector>

using namespace std;

int main()
{
	// 초기 상태
	vector<int> v = { 1, 2, 3 };

	for (const auto& val : v)
		cout << val << " ";

	cout << endl;

	// Insert
	v.insert(v.begin() + 1, 42);
	for (const auto& val : v)
		cout << val << " ";

	cout << endl;

	// Erase
	v.erase(v.begin());
	for (const auto& val : v)
		cout << val << " ";

	cout << endl;

	// Clear
	v.clear();

	return 0;
}

1.3.3 반복자(iterator)

- begin(), end, rbegin(), rend()

#include <iostream>
#include <vector>
using namespace std;

int main() {
    // 벡터 초기화
    vector<int> v = { 10, 20, 30, 40, 50 };

    // 1. 정방향 출력 (begin() ~ end())
    cout << "정방향 출력:" << endl;
    for (auto it = v.begin(); it != v.end(); it++)
        cout << *it << " "; // 출력: 10 20 30 40 50
    cout << endl << endl;

    // 2. 역방향 출력 (rbegin() ~ rend())
    cout << "역방향 출력:" << endl;
    for (auto it = v.rbegin(); it != v.rend(); it++)
        cout << *it << " "; // 출력: 50 40 30 20 10
    cout << endl;

    return 0;
}

※ it앞에 '*'은 무엇인가?
- it: 반복자가 컨테이너의 현재 위치를 가져옴
- *it: 반복자가 가리키는 요소 값을 가져옴

1.3.4 범위 기반 for 루프

for (const auto& val : v) {
    cout << val << " ";
}

1.4 배열과 벡터의 차이점

특 징벡 터 (std::vector)배 열 (int[])
크 기동적 조정 가능고 정
메모리 관리자 동수 동
요소 접근O(1)O(1)
삽입/삭제 비용O(1) (끝), O(n) (중간)N/A (크기 고정)

1.5 벡터의 고급 활용

1.5.1 2차원 벡터

vector<vector<int>> matrix(3, vector<int>(3, 0)); // 3x3 행렬
matrix[1][1] = 42;

1.5.2 정렬

vector<int> v = {3, 1, 4, 1, 5};
sort(v.begin(), v.end());

1.5.3 2차원 벡터를 입력받아 각 문자열을 대문자로 변환하고 반환

#include <iostream>
#include <vector>
#include <string>
#include <cctype> // for toupper

using namespace std;

// 2차원 벡터를 입력받아 대문자로 변환된 2차원 벡터 반환
vector<vector<string>> toUpperCase(const vector<vector<string>>& input)
{
    vector<vector<string>> result = input; // 입력 벡터 복사

    // 각 문자열을 대문자로 변환
    for (auto& row : result) {
        for (auto& col : row) {
            for (auto& ch : col)
                ch = toupper(ch);
        }
    }

    return result; // 변환된 벡터 반환
}

int main() {
    vector<vector<string>> table = {
        {"Jeong", "30", "Seoul"},
        {"Cho", "25", "Los Angeles"},
        {"Jeon", "28", "Ansan"}
    };

    // 대문자로 변환된 2차원 벡터 생성
    vector<vector<string>> upperTable = toUpperCase(table);

    // 결과 출력
    cout << "Original Table:" << endl;
    for (const auto& row : table) {
        for (const auto& col : row)
            cout << col << "\t";
            
        cout << endl;
    }

    cout << "\nUppercase Table:" << endl;
    for (const auto& row : upperTable) {
        for (const auto& col : row)
            cout << col << "\t";
            
        cout << endl;
    }

    return 0;
}

profile
Chung-Ang Univ. EEE.

0개의 댓글