vector에는 초기화 방법에는 여러가지가 있다.

  1. puch_back 사용
  2. reserve 함수를 사용
  3. 크기를 매개변수로 입력
  4. resize함수를 사용
  5. iota
  6. etc ..

각각의 방법에는 메모리 할당의 시점과 횟수의 차이가 있다

// 벡터 예약 성능 테스트
void reservePerformanceTest()
{
    std::cout << "\\n=== 벡터 예약 성능 테스트 ===\\n";

    const int numElements = 10000000;

    // 예약 없는 벡터
    {
        auto start = std::chrono::high_resolution_clock::now();

        std::vector<int> vec;
        int capa = vec.capacity(); // 초기 용량은 0
        std::cout << "초기 용량: " << capa << std::endl;
        std::cout << "초기 크기: " << vec.size() << std::endl;
        for (int i = 0; i < numElements; ++i)
        {
            vec.push_back(i);
        }

        auto end = std::chrono::high_resolution_clock::now();
        std::chrono::duration<double> elapsed = end - start;
        std::cout << "reserve 없음: " << elapsed.count() << "s\\n";
    }

    // 예약된 벡터
    {
        auto start = std::chrono::high_resolution_clock::now();

        std::vector<int> vec;
        vec.reserve(numElements);
        int capa = vec.capacity(); // 초기 용량은 0
        std::cout << "초기 용량: " << capa << std::endl;
        std::cout << "초기 크기: " << vec.size() << std::endl;

        for (int i = 0; i < numElements; ++i)
        {
            vec.push_back(i);
        }

        auto end = std::chrono::high_resolution_clock::now();
        std::chrono::duration<double> elapsed = end - start;
        std::cout << "reserve 사용: " << elapsed.count() << "s\\n";
    }

    // 크기 초기화된 벡터
    {
        auto start = std::chrono::high_resolution_clock::now();

        std::vector<int> vec(numElements);
        int capa = vec.capacity(); // 초기 용량은 0
        std::cout << "초기 용량: " << capa << std::endl;
        std::cout << "초기 크기: " << vec.size() << std::endl;

        for (int i = 0; i < numElements; ++i)
        {
            vec[i] = i;
        }

        auto end = std::chrono::high_resolution_clock::now();
        std::chrono::duration<double> elapsed = end - start;
        std::cout << "크기 초기화: " << elapsed.count() << "s\\n";
    }

    // resize
    {
        auto start = std::chrono::high_resolution_clock::now();

        std::vector<int> vec;
        vec.resize(numElements, 0);
        int capa = vec.capacity(); // 초기 용량은 0
        std::cout << "초기 용량: " << capa << std::endl;
        std::cout << "초기 크기: " << vec.size() << std::endl;
        auto end = std::chrono::high_resolution_clock::now();
        std::chrono::duration<double> elapsed = end - start;
        std::cout << "resize 초기화: " << elapsed.count() << "s\\n";
    }

    // std::iota 사용 (std::generate와 유사)
    {
        auto start = std::chrono::high_resolution_clock::now();

        std::vector<int> vec(numElements);
        std::iota(vec.begin(), vec.end(), 0);
        int capa = vec.capacity(); // 초기 용량은 0
        std::cout << "초기 용량: " << capa << std::endl;
        std::cout << "초기 크기: " << vec.size() << std::endl;

        auto end = std::chrono::high_resolution_clock::now();
        std::chrono::duration<double> elapsed = end - start;
        std::cout << "std::iota 사용: " << elapsed.count() << "s\\n";
    }
}

위 코드를 통해서 테스트 해볼 수 있고 결과는 아래와 같다

=== 벡터 예약 성능 테스트 ===
초기 용량: 0
초기 크기: 0
reserve 없음: 0.0909419s

초기 용량: 10000000
초기 크기: 0
reserve 사용: 0.0678026s

초기 용량: 10000000
초기 크기: 10000000
크기 초기화: 0.0220571s

초기 용량: 10000000
초기 크기: 10000000
resize 초기화: 0.00931919s

초기 용량: 10000000
초기 크기: 10000000
std::iota 사용: 0.0562888s