Namespaces
Variants

std::vector<T,Allocator>:: resize

From cppreference.net

void resize ( size_type count ) ;
(1) (C++20부터 constexpr)
void resize ( size_type count, const value_type & value ) ;
(2) (C++20부터 constexpr)

컨테이너의 크기를 count 개의 요소를 포함하도록 조정합니다:

  • count 가 현재 크기와 같으면 아무 작업도 수행하지 않습니다.
  • 현재 크기가 count 보다 크면, 컨테이너는 처음 count 개의 요소로 축소됩니다.
  • 현재 크기가 count 보다 작으면:
1) 추가적인 T ( ) 복사본 (C++11 이전) 기본 삽입된 요소들 (C++11 이후) 이 추가됩니다.
2) value 의 추가 복사본이 추가됩니다.

목차

매개변수

count - 컨테이너의 새로운 크기
value - 새로운 요소들을 초기화할 값
타입 요구사항
-

다음 조건이 만족될 경우 동작은 정의되지 않음:

1) T DefaultInsertable 이거나 MoveInsertable vector 에 대해 아닌 경우.
2) T CopyInsertable vector 에 대해 아닌 경우.
(since C++11)

복잡도

현재 크기와 count 사이의 차이에 선형적으로 비례합니다. 용량이 count 보다 작을 경우 재할당으로 인해 추가적인 복잡도가 발생할 수 있습니다.

예외

어떤 이유로든 예외가 발생하면, 이 함수들은 아무런 효과를 가지지 않습니다( strong exception safety guarantee ). 명시적으로 지정되지는 않았지만, 새로운 vector 에 필요한 용량이 max_size() 를 초과할 경우 std::length_error 가 발생합니다.

오버로드 ( 1 ) 에서, T 의 이동 생성자가 noexcept 가 아니고 T가 CopyInsertable 요구사항을 만족하지 않으며 * this 에 삽입 가능하지 않은 경우, vector 는 예외를 발생시키는 이동 생성자를 사용합니다. 만약 예외가 발생하면, 보장 사항이 무효화되고 그 효과는 명시되지 않습니다.

(since C++11)

참고 사항

오버로드에서 값 초기화가 바람직하지 않은 경우, ( 1 ) 예를 들어 요소들이 비클래스 타입이고 제로화가 필요하지 않은 경우, 사용자 정의 Allocator::construct 를 제공하여 이를 피할 수 있습니다.
더 작은 크기로 리사이징할 때 벡터 용량은 절대 감소하지 않습니다. 왜냐하면 그러면 모든 반복자가 무효화되기 때문이며, 명세서는 삭제된 요소들에 대한/이후의 반복자들만 무효화하기 때문입니다.

예제

#include <vector>
#include <iostream>
void print(auto rem, const std::vector<int>& c)
{
    for (std::cout << rem; const int el : c)
        std::cout << el << ' ';
    std::cout << '\n';
}
int main()
{
    std::vector<int> c = {1, 2, 3};
    print("The vector holds: ", c);
    c.resize(5);
    print("After resize up to 5: ", c);
    c.resize(2);
    print("After resize down to 2: ", c);
    c.resize(6, 4);
    print("After resize up to 6 (initializer = 4): ", c);
}

출력:

The vector holds: 1 2 3
After resize up to 5: 1 2 3 0 0
After resize down to 2: 1 2
After resize up to 6 (initializer = 4): 1 2 4 4 4 4

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 수정된 동작
LWG 679 C++98 resize() value 를 값으로 전달함 const 참조로 전달
LWG 1525 C++98 resize ( size ( ) ) 의 동작이 명시되지 않음 명시됨
LWG 2033 C++11 1. 요소들이 erase() [1] 를 사용하여 제거됨
2. T 의 타입 요구사항이 부정확함
1. pop_back() 사용
2. 수정됨
LWG 2066 C++11 오버로드 ( 1 ) 가 오버로드 ( 2 ) 의 예외 안전성 보장을 가지지 않음 추가됨
LWG 2160 C++11 LWG 2033의 해결로 인해 요소들이 pop_back() [2] 를 사용하여 제거됨 요소 제거 방법을 명시하지 않음
  1. erase() vector 의 중간에 있는 요소들을 제거할 수 있으므로, 제거된 구간 뒤에 있는 요소들이 빈 공간을 채우기 위해 앞으로 이동될 수 있도록 값 타입이 MoveAssignable 요구사항을 충족해야 합니다. 그러나 resize() vector 의 끝에 있는 요소들만 제거할 수 있으므로 MoveAssignable 요구사항이 필요하지 않습니다.
  2. pop_back() 을 사용하여 요소를 제거하는 것은 요소들이 뒤에서부터 앞으로 순차적으로 제거되어야 함을 의미합니다.

참고 항목

가능한 최대 원소 개수를 반환합니다
(public member function)
원소의 개수를 반환합니다
(public member function)
현재 할당된 저장 공간에 보관할 수 있는 원소의 개수를 반환합니다
(public member function)
컨테이너가 비어 있는지 확인합니다
(public member function)