배열 대 벡터 : 입문 유사점 및 차이점 [닫기]


111

C ++에서 배열과 벡터의 차이점은 무엇입니까? 차이점의 예로는 라이브러리, 상징, 능력 등이 있습니다.

정렬

배열에는 특정 유형의 특정 요소 수가 포함됩니다. 프로그램이 컴파일 될 때 컴파일러가 필요한 공간을 예약 할 수 있도록 배열이 정의 될 때 포함 할 요소의 유형과 수를 지정해야합니다. 컴파일러는 프로그램이 컴파일 될 때이 값을 결정할 수 있어야합니다. 배열이 정의되면 인덱스와 함께 배열의 식별자를 사용하여 배열의 특정 요소에 액세스합니다. [...] 배열은 인덱스가 0입니다. 즉, 첫 번째 요소는 인덱스 0에 있습니다.이 인덱싱 체계는 C ++에서 포인터와 배열 간의 밀접한 관계와 언어가 포인터 산술에 대해 정의하는 규칙을 나타냅니다.

— C ++ 포켓 레퍼런스

벡터

벡터는 배열 스타일의 operator[]임의 액세스 를 제공하는 동적 크기의 객체 시퀀스입니다 . 멤버 함수 push_back는 복사 생성자를 통해 인수를 복사하고 해당 복사본을 벡터의 마지막 항목으로 추가하고 크기를 1 씩 증가시킵니다.pop_back마지막 요소를 제거하여 정반대로 수행합니다. 벡터의 끝에서 항목을 삽입하거나 삭제하는 것은 상각 된 일정한 시간이 걸리며 다른 위치에서 삽입하거나 삭제하는 데는 선형 시간이 걸립니다. 이것이 벡터의 기본입니다. 그들에게는 더 많은 것이 있습니다. 대부분의 경우 벡터는 C 스타일 배열보다 먼저 선택해야합니다. 우선, 동적으로 크기가 조정되므로 필요에 따라 확장 할 수 있습니다. C 배열의 경우처럼 최적의 정적 크기를 알아 내기 위해 모든 종류의 조사를 할 필요는 없습니다. 벡터는 필요에 따라 커지며 필요한 경우 수동으로 더 크게 또는 더 작게 조정할 수 있습니다. 둘째, 벡터는 at멤버 함수로 경계 검사를 제공 하지만operator[]), 따라서 단순히 프로그램 충돌을 관찰하는 대신 존재하지 않는 인덱스를 참조하는 경우 또는 더 나쁜 경우 손상된 데이터로 실행을 계속할 수 있습니다.

— C ++ 요리 책


가장 기본적인 차이점 : 벡터가 좋은 선택이되는 목적이 있습니다.
Jerry Coffin 2013

1
"exhaustive"와 "consise"는 직교합니다. 즉, 하나 는 다른 하나 의미 하지 않을뿐만 아니라 동일한 규모에 있지도 않습니다.
궤도

2
나는 내가 찾고있는 정보와 정확히 일치하는 질문을 닫는 사람들에게 정말 화가 난다. 이것은 너무 자주 발생합니다.
Robert Tamlyn

답변:


142

어레이 :

  • 내장 언어 구조입니다.
  • C89에서 거의 수정되지 않았습니다.
  • 연속적이고 색인 가능한 요소 시퀀스 만 제공합니다 . 종소리와 휘파람 없음;
  • 크기가 고정되어 있습니다. C ++에서 배열의 크기를 조정할 수 없습니다 (POD의 배열이고으로 할당되지 않는 한 malloc).
  • 크기는 동적으로 할당되지 않는 한 컴파일 타임 상수 여야합니다.
  • 선언 한 범위에 따라 저장 공간을 차지합니다.
  • 동적으로 할당 된 경우 명시 적으로 할당을 해제해야합니다.
  • 동적으로 할당 된 경우 포인터 만 가져 오며 크기를 결정할 수 없습니다. 그렇지 않으면 사용할 수 있습니다 sizeof(따라서 sizeof(arr)/sizeof(*arr)포인터에서 부주의하게 사용되면 조용히 실패 하는 일반적인 관용구 ).
  • 대부분의 상황에서 포인터로 자동 감소합니다. 특히, 이는 일반적으로 크기에 대해 별도의 매개 변수를 전달해야하는 함수에 전달할 때 발생합니다.
  • 함수에서 반환 될 수 없습니다.
  • 직접 복사 / 할당 할 수 없습니다.
  • 객체의 동적 배열에는 모든 요소가 먼저 생성되어야하므로 기본 생성자가 필요합니다.

std::vector:

  • 템플릿 클래스입니다.
  • C ++ 전용 구조입니다.
  • 동적 배열 로 구현됩니다 .
  • 동적으로 성장하고 축소합니다.
  • 파괴시 해제되는 메모리를 자동으로 관리합니다.
  • 함수로 전달 / 반환 될 수 있습니다 (값으로).
  • 복사 / 할당 가능 (저장된 모든 요소의 전체 복사를 수행함)
  • 포인터로 붕괴되지는 않지만 명시 적으로 데이터에 대한 포인터를 얻을 수 있습니다 ( &vec[0]예상대로 작동하도록 보장됨).
  • 항상 내부 동적 배열의 크기 (현재 저장된 요소 ) 및 용량 ( 현재 할당 된 블록에 저장할 수있는 요소 수) 을 가져옵니다.
  • 내부 동적 배열은 객체 자체 내부에 할당되지 않지만 (몇 개의 "부기"필드 만 포함) 관련 템플릿 매개 변수에 지정된 할당 자에 의해 동적으로 할당됩니다. 기본 개체는 실제 개체가 할당되는 위치와 관계없이 freestore (소위 힙)에서 메모리를 가져옵니다.
  • 이러한 이유로, 이들은 작고 수명이 짧은 로컬 어레이의 경우 "일반"어레이보다 효율성이 떨어질 수 있습니다.
  • 재 할당 할 때 개체가 복사됩니다 (C ++ 11에서 이동 됨).
  • 저장되는 객체에 대한 기본 생성자가 필요하지 않습니다.
  • 소위 STL의 나머지 부분과 더 잘 통합됩니다 ( begin()/ end()메서드, 일반적인 STL typedef, ...)

또한 배열에 대한 "현대적인 대안"을 고려하십시오 std::array. 이미 설명 다른 대답 의 차이를 std::vector하고 std::array당신이 그것을 좀보고 할 수 있습니다.


1
@MatteoItalia 감사합니다. 참조 한두 개가 좋을 것입니다.
Trancot 2013

1
@Trancot : 좋은 C ++ 책이라면 누구나 할 수 있습니다.
Matteo Italia

6
@Trancot : 더 나은 참고 자료를 드릴 수는 없습니다.이 게시물에서 강조된 차이점은 Standard의 여러 부분에서 비롯되었으며 좋은 C ++ 매뉴얼의 도움으로 더 잘 이해됩니다.
마테오 이탈리아

그러한 광범위한 설명의 예가 좋습니다!
carloswm85

26

나는 배열이 C ++에서 매우 낮은 수준의 구조라고 덧붙일 것이며, "로프를 배울 때"가능한 한 멀리 떨어져 있어야합니다. 심지어 Bjarne Stroustrup도 이것을 권장합니다 (그는 C ++의 디자이너입니다).

벡터는 어레이와 동일한 성능에 매우 가깝지만 많은 편의성과 안전 기능이 있습니다. 원시 배열을 처리하는 API와 인터페이스하거나 자체 컬렉션을 구축 할 때 배열을 사용하기 시작할 것입니다.


1
응용 프로그램 인터페이스 : ( en.wikipedia.org/wiki/API ). 소프트웨어 엔티티 (패키지, 라이브러리, 운영 체제)에 대한 진입 점 모음입니다. 일부 API에는 strcat (char * dst, char * src)와 같은 진입 점이 있으며, 여기서 dst 및 src는 문자 배열로 처리됩니다 (함수 서명이 문자에 대한 포인터를 암시하더라도).
John Källén

11

그 참조는 귀하의 질문에 거의 대답했습니다. 간단히 말해, 벡터의 길이는 동적이고 배열은 고정 된 크기입니다. 배열을 사용할 때 선언 할 때 크기를 지정합니다.

int myArray[100];
myArray[0]=1;
myArray[1]=2;
myArray[2]=3;

벡터의 경우 선언하고 요소를 추가하기 만하면됩니다.

vector<int> myVector;
myVector.push_back(1);
myVector.push_back(2);
myVector.push_back(3);
...

때로는 필요한 요소의 수를 알지 못하므로 벡터가 이러한 상황에 이상적입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.