program tip

배열 대 벡터 : 입문 유사점 및 차이점

radiobox 2020. 8. 15. 09:02
반응형

배열 대 벡터 : 입문 유사점 및 차이점


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

정렬

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

— C ++ 포켓 레퍼런스

벡터

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

— C ++ 요리 책


어레이 :

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

std::vector:

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

Also consider the "modern alternative" to arrays - std::array; I already described in another answer the difference between std::vector and std::array, you may want to have a look at it.


I'll add that arrays are very low-level constructs in C++ and you should try to stay away from them as much as possible when "learning the ropes" -- even Bjarne Stroustrup recommends this (he's the designer of C++).

Vectors come very close to the same performance as arrays, but with a great many conveniences and safety features. You'll probably start using arrays when interfacing with API's that deal with raw arrays, or when building your own collections.


Those reference pretty much answered your question. Simply put, vectors' lengths are dynamic while arrays have a fixed size. when using an array, you specify its size upon declaration:

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

for vectors, you just declare it and add elements

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

at times you wont know the number of elements needed so a vector would be ideal for such a situation.

참고URL : https://stackoverflow.com/questions/15079057/arrays-vs-vectors-introductory-similarities-and-differences

반응형