C++에서 std::vector에 대해 설명하고, 이를 이해하기 위한 다양한 방식을 제공하겠습니다.
std::vector 개요std::vector는 C++ 표준 라이브러리의 동적 배열 컨테이너로, 런타임에 크기를 동적으로 조절할 수 있습니다. 이는 배열과 유사하지만, 크기가 가변적이며 요소를 효율적으로 추가하고 제거할 수 있는 기능을 제공합니다.
std::vector 선언과 사용법#include <iostream>
#include <vector>
int main() {
// std::vector 선언 및 초기화
std::vector<int> vec = {1, 2, 3, 4, 5};
// 요소 접근
std::cout << "First element: " << vec[0] << std::endl;
std::cout << "Second element: " << vec[1] << std::endl;
// 벡터 크기
std::cout << "Vector size: " << vec.size() << std::endl;
return 0;
}
size(): 벡터의 크기를 반환합니다.push_back(value): 벡터의 끝에 요소를 추가합니다.pop_back(): 벡터의 마지막 요소를 제거합니다.at(index): 인덱스를 통해 요소에 접근하며, 범위 검사를 수행합니다.front(): 첫 번째 요소를 반환합니다.back(): 마지막 요소를 반환합니다.data(): 벡터의 첫 번째 요소에 대한 포인터를 반환합니다.clear(): 벡터의 모든 요소를 제거합니다.#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// 요소 추가 및 제거
vec.push_back(6);
vec.pop_back();
// 범위 검사 포함 요소 접근
try {
std::cout << "Element at index 2: " << vec.at(2) << std::endl;
std::cout << "Element at index 5: " << vec.at(5) << std::endl; // 예외 발생
} catch (const std::out_of_range& e) {
std::cerr << "Out of range error: " << e.what() << std::endl;
}
// 첫 번째 및 마지막 요소 접근
std::cout << "First element: " << vec.front() << std::endl;
std::cout << "Last element: " << vec.back() << std::endl;
// 벡터의 첫 번째 요소에 대한 포인터
int* ptr = vec.data();
std::cout << "First element via pointer: " << *ptr << std::endl;
// 벡터 크기 출력
std::cout << "Vector size: " << vec.size() << std::endl;
return 0;
}
std::vector는 동적 배열로, 힙 메모리에 할당됩니다. 벡터의 크기가 증가하면 자동으로 메모리가 재할당되고, 기존 요소는 새로운 메모리로 복사됩니다.
메모리 구조:
+------------------+
| 스택 세그먼트 |
| +--------------+ |
| | std::vector | |
| +--------------+ |
+------------------+
| 힙 세그먼트 |
| +--------------+ |
| | 동적 배열 | |
| +--------------+ |
+------------------+
| 데이터 세그먼트 |
+------------------+
| 코드 세그먼트 |
+------------------+
std::vector의 요소는 인덱스를 통해 접근하며, at 함수를 사용할 경우 범위 검사가 수행됩니다. 이는 잘못된 인덱스 접근으로 인한 오류를 방지합니다.
std::vector는 동적 배열로, 크기를 동적으로 조절할 수 있어 유연성을 제공합니다. 메모리 재할당 시 기존 요소를 새로운 메모리로 복사하는 비용이 발생할 수 있지만, std::vector는 메모리를 미리 할당하여 이러한 비용을 최소화하려고 합니다.
std::vector의 메모리 구조와 요소 접근 방식을 이해하기 쉽게 그림과 표로 표현하였습니다.
std::vector 선언:
std::vector<int> vec = {1, 2, 3, 4, 5};
메모리 구조:
+----+----+----+----+----+
| 1 | 2 | 3 | 4 | 5 |
+----+----+----+----+----+
요소 접근:
vec[0] -> 1
vec[1] -> 2
vec[2] -> 3
vec[3] -> 4
vec[4] -> 5
다양한 상황에서 std::vector를 사용하는 예제를 추가로 제공합니다.
std::vector와 STL 알고리즘#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {5, 2, 3, 1, 4};
// 벡터 정렬
std::sort(vec.begin(), vec.end());
// 정렬된 벡터 출력
std::cout << "Sorted vector: ";
for (int n : vec) {
std::cout << n << " ";
}
std::cout << std::endl;
return 0;
}
std::vector#include <iostream>
#include <vector>
int main() {
// 2차원 std::vector 선언 및 초기화
std::vector<std::vector<int>> vec = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 2차원 벡터 요소 접근 및 출력
for (const auto& row : vec) {
for (int val : row) {
std::cout << val << " ";
}
std::cout << std::endl;
}
return 0;
}
std::vector는 C++ 표준 라이브러리의 동적 배열 컨테이너로, 런타임에 크기를 동적으로 조절할 수 있습니다. 이는 배열과 유사하지만, 크기가 가변적이며 요소를 효율적으로 추가하고 제거할 수 있는 기능을 제공합니다. std::vector는 힙 메모리에 할당되며, 요소 접근 시 범위 검사를 통해 안전성을 제공합니다. 운영체제는 std::vector가 저장되는 메모리의 할당과 해제를 관리하여 프로그램이 효율적으로 std::vector를 사용할 수 있도록 돕습니다.
이와 같은 내용을 통해 C++의 std::vector에 대해 더 깊이 이해할 수 있을 것입니다. 추가로 궁금한 사항이 있으면 알려주세요!