std :: vector의 초기 크기를 설정하는 방법은 무엇입니까?


130

나는 vector<CustomClass*>벡터에 많은 항목을 넣었고 빠른 액세스가 필요하므로 목록을 사용하지 않습니다. 벡터의 초기 크기를 설정하는 방법 (예 : 20 000 자리이므로 새 삽입시 복사를 피하기 위해)?


1
std::vector요구 사항에 더 잘 맞는 참조에 따라 생성자와 두 가지 함수가 있습니다.
chris

1
복사는 초기 값 만 설정하는 것을 피할 수 없습니다.
juanchopanza

1
사본을 피 하시겠습니까? 복사 비용 측면에서 포인터 저장은 매우 가볍습니다.
user7116


1
@Damir, std::vector제목에서 의미 했 습니까?
Robᵩ

답변:


180
std::vector<CustomClass *> whatever(20000);

또는:

std::vector<CustomClass *> whatever;
whatever.reserve(20000);

전자는 배열의 실제 크기를 설정합니다. 즉, 20000 포인터의 벡터로 만듭니다. 후자는 벡터를 비워 두지 만 20000 포인터를위한 공간을 확보하므로 재할 당하지 않고도 많은 수를 삽입 할 수 있습니다.

적어도 내 경험상 이들 중 하나가 성능에 큰 차이를 만드는 것은 매우 드문 일이지만 일부 상황에서는 정확성에 영향을 줄 수 있습니다. 특히, 재 할당이 발생하지 않는 한 벡터에 대한 반복자는 유효한 상태를 유지하며 크기 / 예약 공간을 설정 한 후에는 재 할당이없는 한 재 할당 할 수 없습니다. 그 이상으로 크기를 늘리십시오.


다음 중 많은 수의 삽입 / 삭제에 더 효과적인 방법은 무엇입니까?
ctor

3
@Loggie : 효율성에 차이가 있을지 의심됩니다. 전자는 그것을 사용하는 방법을 변경합니다. 전자는 포인터를 지정하기 때문에 포인터는 추가 whatever[10000] = somepointer;하는 push_back각 포인터를 요구합니다 . 적어도에 익숙하다면 vector후자는 아마도 더 단순하고 자연 스럽습니다.
Jerry Coffin

복사되는 컨테이너의 크기를 알고 있다면, push_back 대신 크기를 조정 한 다음 복사하는 것이 왜 더 효율적이지 않습니까?

1
@Cincinnatus :에 대한 호출이 있기 때문에 reserve메모리 크기를 미리 할당합니다. 이론적으로 크기를 설정하면 항목을 추가 할 때마다 현재 크기가 증가하지 않기 때문에 크기를 더 빠르게 설정할 수 있습니다. 실제로, 나는 당신이 그것을 측정 할 수 있는지 의심합니다.
Jerry Coffin

1
실제로, 당신이 뜨거운 길에서 이것을하고 코드를 많이 호출한다면, 많은 지시와 시간 절약을 할 수 있습니다.
bayindirh

15

초기 할당 크기를 설정하거나 초기 생성자에서 예약하려면 예약 기능을 사용해야합니다.

vector<CustomClass *> content(20000);

또는

vector<CustomClass *> content;
...
content.reserve(20000);

reserve()요소를 만들 때 vector많은 요소를 (적어도?) 충분한 공간을 할당합니다. 에 요소가 없지만 vector메모리를 사용할 수 있습니다. push_back()메모리가 이미 할당되었으므로 속도가 빨라질 수 있습니다.


크기를 할당하면 (예 정수 인수를 전달하여 생성 중에 제공 될 수있다 std::vector<Custom Class*> content(100);)
adelbertc

@kstruct : 그렇습니다. 그러나 매우 적은 양으로 효율성이 떨어질 수 있습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.