std-vector

Jaemyeong Lee·2024년 6월 7일

C/C++

목록 보기
33/56

GPT

C++에서 std::vector에 대해 설명하고, 이를 이해하기 위한 다양한 방식을 제공하겠습니다.

1. std::vector 개요

std::vector는 C++ 표준 라이브러리의 동적 배열 컨테이너로, 런타임에 크기를 동적으로 조절할 수 있습니다. 이는 배열과 유사하지만, 크기가 가변적이며 요소를 효율적으로 추가하고 제거할 수 있는 기능을 제공합니다.

2. std::vector 선언과 사용법

선언과 초기화

#include <iostream>
#include <vector>

int main() {
    // std::vector 선언 및 초기화
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // 요소 접근
    std::cout << "First element: " << vec[0] << std::endl;
    std::cout << "Second element: " << vec[1] << std::endl;

    // 벡터 크기
    std::cout << "Vector size: " << vec.size() << std::endl;

    return 0;
}

주요 함수와 사용법

  • size(): 벡터의 크기를 반환합니다.
  • push_back(value): 벡터의 끝에 요소를 추가합니다.
  • pop_back(): 벡터의 마지막 요소를 제거합니다.
  • at(index): 인덱스를 통해 요소에 접근하며, 범위 검사를 수행합니다.
  • front(): 첫 번째 요소를 반환합니다.
  • back(): 마지막 요소를 반환합니다.
  • data(): 벡터의 첫 번째 요소에 대한 포인터를 반환합니다.
  • clear(): 벡터의 모든 요소를 제거합니다.
#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // 요소 추가 및 제거
    vec.push_back(6);
    vec.pop_back();

    // 범위 검사 포함 요소 접근
    try {
        std::cout << "Element at index 2: " << vec.at(2) << std::endl;
        std::cout << "Element at index 5: " << vec.at(5) << std::endl; // 예외 발생
    } catch (const std::out_of_range& e) {
        std::cerr << "Out of range error: " << e.what() << std::endl;
    }

    // 첫 번째 및 마지막 요소 접근
    std::cout << "First element: " << vec.front() << std::endl;
    std::cout << "Last element: " << vec.back() << std::endl;

    // 벡터의 첫 번째 요소에 대한 포인터
    int* ptr = vec.data();
    std::cout << "First element via pointer: " << *ptr << std::endl;

    // 벡터 크기 출력
    std::cout << "Vector size: " << vec.size() << std::endl;

    return 0;
}

3. 컴퓨터 구조 및 운영체제 측면에서의 이해

메모리 할당

std::vector는 동적 배열로, 힙 메모리에 할당됩니다. 벡터의 크기가 증가하면 자동으로 메모리가 재할당되고, 기존 요소는 새로운 메모리로 복사됩니다.

메모리 구조:
+------------------+
|   스택 세그먼트   |
| +--------------+ |
| |  std::vector  | |
| +--------------+ |
+------------------+
|   힙 세그먼트     |
| +--------------+ |
| |  동적 배열    | |
| +--------------+ |
+------------------+
|   데이터 세그먼트 |
+------------------+
|   코드 세그먼트   |
+------------------+

메모리 접근

std::vector의 요소는 인덱스를 통해 접근하며, at 함수를 사용할 경우 범위 검사가 수행됩니다. 이는 잘못된 인덱스 접근으로 인한 오류를 방지합니다.

성능 최적화

std::vector는 동적 배열로, 크기를 동적으로 조절할 수 있어 유연성을 제공합니다. 메모리 재할당 시 기존 요소를 새로운 메모리로 복사하는 비용이 발생할 수 있지만, std::vector는 메모리를 미리 할당하여 이러한 비용을 최소화하려고 합니다.

4. 그림과 삽화

std::vector의 메모리 구조와 요소 접근 방식을 이해하기 쉽게 그림과 표로 표현하였습니다.

std::vector 선언:
std::vector<int> vec = {1, 2, 3, 4, 5};

메모리 구조:
+----+----+----+----+----+
|  1 |  2 |  3 |  4 |  5 |
+----+----+----+----+----+

요소 접근:
vec[0] -> 1
vec[1] -> 2
vec[2] -> 3
vec[3] -> 4
vec[4] -> 5

5. 예제 코드 확장

다양한 상황에서 std::vector를 사용하는 예제를 추가로 제공합니다.

std::vector와 STL 알고리즘

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {5, 2, 3, 1, 4};

    // 벡터 정렬
    std::sort(vec.begin(), vec.end());

    // 정렬된 벡터 출력
    std::cout << "Sorted vector: ";
    for (int n : vec) {
        std::cout << n << " ";
    }
    std::cout << std::endl;

    return 0;
}

2차원 std::vector

#include <iostream>
#include <vector>

int main() {
    // 2차원 std::vector 선언 및 초기화
    std::vector<std::vector<int>> vec = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };

    // 2차원 벡터 요소 접근 및 출력
    for (const auto& row : vec) {
        for (int val : row) {
            std::cout << val << " ";
        }
        std::cout << std::endl;
    }

    return 0;
}

요약

std::vector는 C++ 표준 라이브러리의 동적 배열 컨테이너로, 런타임에 크기를 동적으로 조절할 수 있습니다. 이는 배열과 유사하지만, 크기가 가변적이며 요소를 효율적으로 추가하고 제거할 수 있는 기능을 제공합니다. std::vector는 힙 메모리에 할당되며, 요소 접근 시 범위 검사를 통해 안전성을 제공합니다. 운영체제는 std::vector가 저장되는 메모리의 할당과 해제를 관리하여 프로그램이 효율적으로 std::vector를 사용할 수 있도록 돕습니다.

이와 같은 내용을 통해 C++의 std::vector에 대해 더 깊이 이해할 수 있을 것입니다. 추가로 궁금한 사항이 있으면 알려주세요!

profile
李家네_공부방

0개의 댓글