IT박스

vector :: resize ()와 vector :: reserve () 중에서 선택

itboxs 2020. 6. 18. 21:35
반응형

vector :: resize ()와 vector :: reserve () 중에서 선택


vector멤버 변수에 메모리를 미리 할당하고 있습니다. 아래 코드는 최소한의 부분입니다

class A {
  vector<string> t_Names;
public:
  A () : t_Names(1000) {}
};

이제 어느 시점에서 t_Names.size()같으면 1000. 크기를 (으)로 늘리려 고합니다 100. 그런 다음에 도달 1100하면 다시 증가 100합니다.

내 질문 사이에서 선택하는 것입니다 vector::resize()vector::reserve(). 이런 종류의 시나리오에서 더 나은 선택이 있습니까?

편집 :에 대한 정확한 견적이 t_Names있습니다. 나는 주변 700있다고 추정합니다 800. 그러나 특정 상황에서는 드물게 성장할 수 있습니다 1000.


두 기능은 크게 다른 일을합니다!

resize()메소드는 (그리고 인자를 생성자에게 전달하는 것은 그것과 동등합니다) 벡터에 적절한 수의 요소를 삽입하거나 삭제하여 주어진 크기로 만듭니다 (값을 지정하기 위해 선택적인 두 번째 인수가 있습니다). 그것은 영향을 미치며 size(), 반복은 모든 요소를 ​​거치며, push_back은 그 뒤에 삽입되며를 사용하여 직접 액세스 할 수 있습니다 operator[].

reserve()메소드는 메모리 만 할당하지만 초기화되지 않은 상태로 둡니다. 에 영향 capacity()을 주지만 size()변경되지 않습니다. 벡터에 아무것도 추가되지 않기 때문에 객체에 대한 값이 없습니다. 그런 다음 요소를 삽입하면 미리 할당 되었기 때문에 재 할당이 발생하지 않지만 이것이 유일한 효과입니다.

그래서 그것은 당신이 원하는 것에 달려 있습니다. 기본 항목을 1000 개 배열하려면을 사용하십시오 resize(). 1000 개의 항목을 삽입 할 것으로 예상되는 배열을 원하고 두 개의 할당을 피하려면을 사용하십시오 reserve().

편집 : Blastfurnace의 의견으로 질문을 다시 읽고 귀하의 경우 정답이 수동으로 사전 할당되지 않는다는 것을 깨달았습니다 . 필요할 때 요소를 계속 삽입하십시오. 벡터는 필요에 따라 자동으로 재 할당되며 언급 된 수동 방법보다 효율적으로 수행합니다 . reserve()이해하기 쉬운 유일한 경우 는 사전에 쉽게 구할 수있는 전체 크기를 합리적으로 정확하게 추정 할 때입니다.

EDIT2 : 광고 질문 수정 : 초기 견적이있는 경우 reserve()해당 견적입니다. 충분하지 않은 것으로 판명되면 벡터로 설정하십시오.


resize()메모리를 할당 할뿐만 아니라 원하는 크기 만큼 인수로 전달할 수있는 인스턴스를 만듭니다 . 그러나 메모리 만 할당하고 인스턴스를 만들지 않습니다. 그건,resize()reserve()

std::vector<int> v1;
v1.resize(1000); //allocation + instance creation
cout <<(v1.size() == 1000)<< endl;   //prints 1
cout <<(v1.capacity()==1000)<< endl; //prints 1

std::vector<int> v2;
v2.reserve(1000); //only allocation
cout <<(v2.size() == 1000)<< endl;   //prints 0
cout <<(v2.capacity()==1000)<< endl; //prints 1

출력 ( 온라인 데모 ) :

1
1
0
1

따라서 resize()기본 생성 개체를 원하지 않으면 바람직하지 않을 수 있습니다. 느려질 것입니다. 또한 push_back()새로운 요소를 size()추가하면 새 메모리를 할당 하여 벡터의 벡터가 더 증가 합니다 (이는 기존 요소를 새로 할당 된 메모리 공간으로 이동 함을 의미 함). 당신이 사용하는 경우 reserve()이미 충분히 할당 된 메모리가 확인하기 위해 시작시, size()벡터의 때 당신 증가 할 것이다 push_back()그것, 그러나 당신이 그것을 위해 예약 된 공간이 부족 때까지 다시 새로운 메모리를 할당하지 않습니다 .


예약시 객체를 초기화하지 않으려면 예약하십시오. 또한 크기를 조정할 때 사용 횟수와 사용 횟수를 논리적으로 구분하고 추적하는 것이 좋습니다. 따라서 인터페이스에는 동작상의 차이가 있습니다. 벡터는 예약 된 경우 동일한 수의 요소를 나타내며 시나리오에서 크기를 조정하면 100 개의 요소가 커집니다.

이런 종류의 시나리오에서 더 나은 선택이 있습니까?

그것은 기본 행동과 싸울 때 전적으로 당신의 목표에 달려 있습니다. 어떤 사람들은 커스터마이즈 된 할당 자들을 선호 할 것입니다. 그러나 우리는 당신이 잘 조언하기 위해 프로그램에서 무엇을 해결하려고하는지 더 잘 알고 있어야합니다.

fwiw, 많은 벡터 구현은 할당해야 할 때 할당 된 요소 수를 두 배로 늘릴 것입니다. 피크 할당 크기를 최소화하려고하거나 잠금이없는 프로그램이나 다른 것을 위해 충분한 공간을 예약하려고합니까?


설명에서 벡터 t_Names의 할당 된 저장 공간을 "예약"하려는 것 같습니다.

단지 할당하지만 구성하지 않는 resize새로 할당 된 벡터 초기화합니다 reserve. 따라서 '예약'은 '크기 조정'보다 훨씬 빠릅니다.

크기 조정예약 차이에 관한 설명서를 참조 할 수 있습니다

참고 URL : https://stackoverflow.com/questions/7397768/choice-between-vectorresize-and-vectorreserve

반응형