인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

yoy06118님의 프로필 이미지
yoy06118

작성한 질문수

홍정모의 따라하며 배우는 C++

6.21 std::vector 소개

벡터에 변수로 array 입력

작성

·

453

1

std::vector<int> array;
	int arr[] = { 1, 2, 4, 5, 6 }; 
	int* ar = new int[5];
	ar = arr;
	//초기화 하는 법
	std::vector<int> array2 = { 1, 2, 3, 4, 5 };
	std::vector<int> array3 = arr; 

벡터를 사용한 동적 배열의 경우에는 new int를 사용한 동적 배열처럼 변수로 입력 받아 배열을 만들 수 있는 방법이 없는지 궁금합니다. vector를 초기화 할 때 arr을 이용하려고 하니 계속 오류가 발생하는데, arr처럼 초기화 하기 위해서는 array3에 같은 값을 적어주는 방법 밖에는 없는 지 궁금합니다.

 

그리고 정적 배열에 비해 동적 배열이 가지는 장점이 사이즈를 런타임 중에 결정할 수 있다는 것만 있는지도 궁금합니다.

항상 친절하신 답변 정말 감사합니다.^^

답변 1

2

안녕하세요, 답변 도우미 Soobak 입니다.

 

질문 1) 벡터를 사용한 동적 배열의 경우에는 new int를 사용한 동적 배열처럼 변수로 입력 받아 배열을 만들 수 있는 방법이 없는지 궁금합니다. vector를 초기화 할 때 arr을 이용하려고 하니 계속 오류가 발생하는데, arr처럼 초기화 하기 위해서는 array3에 같은 값을 적어주는 방법 밖에는 없는 지 궁금합니다.
: 다양한 초기화 방법들이 있습니다. 👍
방법들과 예시 코드를 첨부드립니다.

  • 범위 기반 초기화
    C 스타일 배열 또는 다른 컨테이너로부터 벡터를 초기화 할 수 있습니다.

    int arr[] = {1, 2, 3, 4, 5};
    std::vector<int> vec1(arr, arr + sizeof(arr) / sizeof(int));
  • 초기화 리스트

    질문해주신 내용의 배열 초기화 방법처럼 초기화할 수 있습니다.
    다만, C++11 이후의 표준에서만 가능합니다.

    std::vector<int> vec2 = {1, 2, 3, 4, 5};
  • 복사 초기화

    기존 벡터의 일부분 또는 전체를 사용하여 새 벡터를 초기화할 수 있습니다.

    std::vector<int> vec3 = vec1;   // 전체 복사 
    
    std::vector<int> vec4(vec1.begin(), vec1.begin() + 3);   // 첫 3개 원소만 복사
  • 값과 크기를 사용한 초기화
    특정 값으로 벡터의 크기만큼 초기화할 수 있습니다.
    저는 주로 알고리즘 문제풀이에서 특정 값으로 초기화할 때 이 방법을 가장 많이 사용했던 것 같습니다.

    std::vector<int> vec5(5, 10);  // 크기가 5이며 모든 원소의 값이 10인 벡터

 
이러한 초기화 방법 및 vector 컨테이터의 사용 예시와 관련해서 도움이 되실 문서 링크를 첨부드립니다.
cppreference - std::vector (링크)
해당 문서 밑의 여러가지 멤버 함수들에 대해서 직접 사용해보시면서 사용법을 익히시는 것도 좋은 학습 방법이라고 생각합니다.

 

 

질문 2) 정적 배열에 비해 동적 배열이 가지는 장점이 사이즈를 런타임 중에 결정할 수 있다는 것만 있는지도 궁금합니다.
: 상황에 따라서 다양한 장점이 더 있다고 말씀드리는 것이 적절할 것 같습니다.

  • 장점

    • 사이즈 조절 : 말씀하신대로, 동적 배열의 크기는 프로그램 실행 중에도 변경될 수 있습니다.
      vector 컨테이너로 예를 들면, push_back() , resize() , pop_back() 등의 함수를 제공해주므로 동적으로 원소를 추가하거나 제거가 가능하고 사용도 편리합니다.

    • 메모리 사용 최적화 : 상황과 요구 사항 등에 따라서 메모리를 할당하거나 해제하는 것이 가능하므로, 불필요한 메모리 소비를 최소화할 수 있습니다.

    • 대용량 데이터 처리 : 정적 배열은 스택 이라는 메모리 공간에 할당되므로, 너무 크기가 큰 정적 배열을 선언하려고 하면 스택 오버플로우의 위험이 있습니다.
      반면, 동적 배열은 메모리 공간에 할당되므로, 상대적으로 더 큰 메모리 공간을 활용할 수 있습니다.

  • 단점

    • 메모리 관리 : vector 컨테이너를 사용하면 문제가 적거나 없는 부분이지만, 만약 직접 동적 배열의 메모리를 관리한다면 ( new , delete 사용) 메모리 누수나 할당 해제 오류의 위험이 있습니다.

    • 성능 오버헤드 : 동적 메모리의 빈번한 할당과 해제는 성능에 영향을 미칠 수 있습니다.

     

정리하면, 동적 배열은 크기 조절의 유연성, 메모리 사용의 최적화, 대용량 데이터 처리 등의 장점이 있다고 말씀드릴 수 있겠네요.

yoy06118님의 프로필 이미지
yoy06118

작성한 질문수

질문하기