C++

[C++] push_back 함수

코딩 메모장 2024. 10. 14. 22:31
728x90

C++에서 push_back 함수는 주로 std::vector와 같은 동적 배열 컨테이너에서 사용되는 함수입니다. 이 함수는 컨테이너의 끝에 새로운 요소를 추가하는 역할을 합니다.

 

함수 정의

push_back 함수는 std::vector와 같은 동적 컨테이너에서 사용되며, 컨테이너의 마지막에 요소를 추가합니다.

 

사용 예시

#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers;
    numbers.push_back(10);
    numbers.push_back(20);
    numbers.push_back(30);

    for (int num : numbers) {
        std::cout << num << " ";
    }

    return 0;
}

 

위의 코드에서 push_back을 사용하여 numbers 벡터에 10, 20, 30을 추가합니다. 결과적으로 10 20 30이 출력됩니다.

 

std::vector와 배열의 차이점

numbers는 std::vector <int> 타입의 객체로, 동적 배열과 비슷한 구조를 가지고 있지만, 배열보다 더 많은 기능과 편의성을 제공합니다. 크기 조정, 메모리 관리, 다양한 기능의 측면에서 배열과는 차이가 있습니다.

 

[C++] - [C++] #include / std::vector

 

[C++] #include <vector> / std::vector

동적 크기 조정: std::vector는 요소를 추가하거나 삭제할 때 필요한 만큼의 메모리를 자동으로 할당하여 크기를 조정합니다. 초기 크기를 설정할 필요가 없고, 필요에 따라 메모리를 동적으로 할

jeagyoo2.tistory.com

 

1. 크기 조정

std::vector는 요소가 추가될 때마다 자동으로 크기를 조정합니다. 사용자는 배열의 크기를 미리 설정하거나 직접 관리할 필요가 없습니다. push_back을 통해 요소를 추가하면 벡터의 크기가 자동으로 증가합니다. 만약 벡터가 현재 수용할 수 있는 용량을 초과하면, 벡터는 더 큰 메모리 블록을 할당하고 기존 요소들을 복사한 뒤 계속해서 새로운 요소를 추가할 수 있습니다.

2. 메모리 관리

std::vector는 메모리를 자동으로 관리합니다. 내부적으로 필요한 메모리를 동적으로 할당하고, 벡터의 용량(capacity)이 초과될 경우 새로운 메모리를 할당한 후 기존 요소들을 복사합니다.

  • 새로운 메모리 할당: 벡터의 용량이 부족할 경우, 더 큰 크기의 새로운 메모리 블록이 할당됩니다. 일반적으로 이 크기는 현재 용량의 두 배로 증가합니다.
  • 기존 요소 복사: 기존의 모든 요소가 새로 할당된 메모리 블록으로 복사됩니다. 이 과정에서 각 요소의 복사 생성자가 호출됩니다.
  • 기존 메모리 해제: 이전에 사용된 메모리는 더 이상 필요하지 않으므로 해제됩니다. 이때 벡터의 소멸자 또한 호출되어 내부 자원을 정리합니다.
  • 포인터 업데이트: 마지막으로 벡터는 새로운 메모리 블록을 가리키도록 포인터를 업데이트합니다.

따라서 push_back을 통해 벡터에 요소를 추가할 때, 단순히 새로운 요소만 추가하는 것이 아니라 메모리 재할당복사 과정이 내부적으로 발생할 수 있습니다. 이러한 과정은 성능에 영향을 미칠 수 있으므로 대규모 데이터를 다룰 때는 reserve() 함수를 사용하여 성능 최적화를 고려할 수 있습니다.

3. 다양한 기능

std::vector는 배열보다 훨씬 더 많은 유용한 기능을 제공합니다. 예를 들어:

  • size(): 벡터에 저장된 요소의 개수를 반환합니다.
  • capacity(): 벡터가 현재 재할당 없이 수용할 수 있는 최대 요소 수를 반환합니다.
  • empty(): 벡터가 비어 있는지 확인합니다.
  • at(): 인덱스를 사용하여 요소에 안전하게 접근할 수 있습니다.
  • clear(): 벡터의 모든 요소를 삭제합니다.

이러한 메서드들은 배열에서 제공되지 않는 기능들로, 동적 메모리 관리와 더불어 벡터를 보다 쉽게 사용할 수 있게 해줍니다.

성능 최적화: reserve()

벡터의 크기가 자주 증가하고 재할당이 발생하면 성능에 영향을 미칠 수 있습니다. 이를 방지하기 위해 reserve() 함수를 사용하여 미리 벡터의 용량을 설정할 수 있습니다. 이렇게 하면 재할당과 복사 과정을 줄일 수 있어 성능을 최적화할 수 있습니다.

numbers.reserve(100); // 100개의 요소를 수용할 수 있도록 미리 메모리 할당

 

이 코드를 통해, 벡터에 100개의 요소를 추가하더라도 중간에 메모리 재할당이 발생하지 않으므로 성능을 향상시킬 수 있습니다.

복사 생성자와 성능 고려

push_back 함수는 요소를 추가할 때 복사 생성자가 호출됩니다. 이는 벡터가 새로운 메모리 블록을 할당할 때 기존 요소들을 복사하는 과정에서 발생합니다. 만약 벡터에 저장된 객체가 크거나 복사 비용이 많이 든다면 성능에 영향을 미칠 수 있습니다. 이러한 경우 이동 생성자를 사용할 수 있도록 객체의 이동 지원 여부를 고려하는 것이 좋습니다.

 

결론

push_back 함수는 C++에서 동적 배열 컨테이너인 std::vector에서 요소를 추가하는 데 매우 유용합니다. 자동 크기 조정, 동적 메모리 관리, 다양한 기능들을 제공하여 배열보다 더 많은 편리함을 제공합니다. 하지만 대규모 데이터 처리 시 성능 최적화를 위해 reserve()를 사용하는 등의 방법을 고려할 필요가 있습니다. 벡터의 내부 동작을 이해하고 적절히 활용하면 효율적인 프로그램을 작성할 수 있습니다.

728x90

'C++' 카테고리의 다른 글

[C++] std::vector와 malloc함수 비교  (0) 2024.10.17
[C++] 컨테이너(container)  (0) 2024.10.15
[C++] fmodf함수  (0) 2024.10.13
[C++] #include <vector> / std::vector  (1) 2024.10.11
[C++] STL알고리즘과 vector와의 연동  (1) 2024.10.10