Vector Container: 두 판 사이의 차이

기술노트
편집 요약 없음
태그: 되돌려진 기여
편집 요약 없음
 
(같은 사용자의 중간 판 2개는 보이지 않습니다)
1번째 줄: 1번째 줄:
= C++ Vector 컨테이너 =
= [C++] Vector 컨테이너 기초 =


Vector는 C++ STL에서 제공하는 동적 배열 컨테이너로, 자동으로 메모리를 할당하고 관리합니다. 데이터 타입을 템플릿 매개변수로 지정할 있으며, 스택과 유사한 push/pop 연산을 지원합니다.
'''Vector'''는 C++에서 제공하는 자료구조로, 자동으로 메모리를 관리해 주는 동적 배열입니다. 일반적인 배열과 다르게 크기가 자동으로 늘어나거나 줄어들 있어서 매우 편리합니다.


== 기본 개념 ==
== Vector 특징 ==
* 자동으로 크기가 늘어나고 줄어듦
* 데이터의 추가와 제거가 쉬움
* 인덱스로 바로 접근 가능 (배열처럼 사용 가능)
* 내부적으로 연속된 메모리 공간에 저장됨


Vector는 연속된 메모리 공간에 원소를 저장하며, 크기가 동적으로 조절됩니다. 내부적으로는 다음 두 가지 중요한 속성을 관리합니다:
== 기본 사용법 ==
* '''size''': 실제로 저장된 원소의 개수
먼저 '''<vector>''' 헤더 파일을 포함해야 합니다.
* '''capacity''': 메모리에 할당된 공간의 크기
 
Vector의 크기가 capacity를 초과하면 더 큰 메모리 공간을 할당하고 기존 요소를 복사하는 재할당(reallocation) 과정이 발생합니다.
 
== 헤더 파일 포함 ==


<syntaxhighlight lang="cpp">
<syntaxhighlight lang="cpp">
17번째 줄: 16번째 줄:
</syntaxhighlight>
</syntaxhighlight>


== 선언 및 초기화 ==
다음과 같이 벡터를 선언합니다. (데이터 타입을 정해야 합니다)


<syntaxhighlight lang="cpp">
<syntaxhighlight lang="cpp">
// 빈 벡터 생성
vector<int> v;         // 정수형 벡터 생성
vector<int> v1;
vector<string> s;     // 문자열 벡터 생성
 
// 특정 값으로 초기화된 벡터 생성 (5개의 2로 초기화)
vector<int> v2(5, 2); // {2, 2, 2, 2, 2}
 
// 다른 벡터의 복사본 생성
vector<int> v3(v2);
 
// 초기화 리스트 사용
vector<int> v4 = {1, 2, 3, 4, 5};
 
// 특정 범위의 요소로 초기화
vector<int> v5(v4.begin(), v4.begin() + 3);  // {1, 2, 3}
</syntaxhighlight>
</syntaxhighlight>


== 주요 멤버 함수 ==
== 주요 기능 (함수) ==
벡터에서 자주 사용하는 함수는 다음과 같습니다.


=== 요소 접근 ===
{| class="wikitable"
! 함수 !! 설명 !! 사용법 예시
|-
| push_back() || 벡터 끝에 원소 추가 || v.push_back(10);
|-
| pop_back() || 벡터 끝의 원소 제거 || v.pop_back();
|-
| at() || 특정 위치 원소 접근 (안전한 방법, 범위 체크 있음) || v.at(0);
|-
| [ ] || 특정 위치 원소 접근 (빠른 방법, 범위 체크 없음) || v[0];
|-
| front() || 첫 번째 원소 참조 || v.front();
|-
| back() || 마지막 원소 참조 || v.back();
|-
| clear() || 벡터의 모든 원소 삭제 || v.clear();
|-
| size() || 원소 개수 확인 || v.size();
|-
| capacity() || 할당된 메모리 크기 확인 || v.capacity();
|-
| empty() || 벡터가 비어있는지 확인 (true 또는 false 반환) || v.empty();
|-
| resize(n) || 벡터 크기를 n으로 변경 (크기를 늘릴 경우 기본값으로 채움) || v.resize(5);
|-
| assign(n, value) || 벡터를 n개의 원소로 채우고 각 원소를 value로 설정 || v.assign(3, 7);
|}


<syntaxhighlight lang="cpp">
=== size와 capacity의 차이점 ===
// 인덱스로 접근 (범위 검사 없음, 빠름)
* '''size'''는 현재 실제 저장된 원소의 개수
int elem1 = v[0];
* '''capacity'''는 실제 할당된 전체 메모리 공간 크기


// 안전한 접근 방법 (범위 검사 있음, 예외 발생 가능)
== Vector를 사용한 간단한 예제 ==
int elem2 = v.at(0);
다음은 간단한 벡터 사용 예제입니다.
 
// 첫 번째와 마지막 요소 접근
int first = v.front();
int last = v.back();
</syntaxhighlight>
 
=== 요소 추가 및 삭제 ===


<syntaxhighlight lang="cpp">
<syntaxhighlight lang="cpp">
// 끝에 요소 추가
#include <iostream>
v.push_back(6);
#include <vector>
using namespace std;


// 끝에서 요소 제거
int main() {
v.pop_back();
    vector<int> v; // 정수형 벡터 생성


// 특정 위치에 요소 삽입 (iterator 필요)
    v.push_back(1); // 벡터에 1 추가
v.insert(v.begin() + 2, 10); // 세 번째 위치에 10 삽입
    v.push_back(2); // 벡터에 2 추가
    v.push_back(3); // 벡터에 3 추가


// 특정 위치의 요소 삭제 (iterator 필요)
    // 벡터의 모든 원소 출력 (for문 사용)
v.erase(v.begin() + 1); // 두 번째 요소 삭제
    for(int i = 0; i < v.size(); i++) {
        cout << v[i] << endl;
    }


// 모든 요소를 특정 값으로 할당
     return 0;
v.assign(5, 2);  // {2, 2, 2, 2, 2}
 
// 모든 요소 제거 (capacity는 유지)
v.clear();
</syntaxhighlight>
 
=== 크기 및 용량 관리 ===
 
<syntaxhighlight lang="cpp">
// 현재 요소 개수 확인
size_t size = v.size();
 
// 할당된 메모리 공간 크기 확인
size_t cap = v.capacity();
 
// 비어있는지 확인
bool isEmpty = v.empty();
 
// 크기 변경 (필요시 요소 추가 또는 제거)
v.resize(10);  // 크기를 10으로 변경
 
// 최소 용량 확보 (필요시에만 재할당)
v.reserve(100);  // 최소 100개 요소를 저장할 공간 확보
 
// 여분의 용량 제거
v.shrink_to_fit();
</syntaxhighlight>
 
== 반복자(Iterator) 사용 ==
 
반복자는 컨테이너의 요소를 순회하는 데 사용됩니다.
 
<syntaxhighlight lang="cpp">
// 기본 for 루프 예제
vector<int>::iterator iter;
for(iter = v.begin(); iter != v.end(); iter++) {
    cout << *iter << endl;
}
 
// 범위 기반 for 루프 (C++11 이상)
for(const auto& elem : v) {
    cout << elem << endl;
}
 
// 역방향 반복자
for(auto rit = v.rbegin(); rit != v.rend(); ++rit) {
     cout << *rit << endl; // 역순으로 출력
}
}
</syntaxhighlight>
</syntaxhighlight>


== 알고리즘과 함께 사용 ==
결과:
<pre>
1
2
3
</pre>


<code><algorithm></code> 헤더와 함께 사용하면 다양한 연산을 효율적으로 수행할 수 있습니다.
== Iterator(반복자)를 이용한 출력 예제 ==
 
벡터를 더 간단히 순회할 수 있는 방법으로 반복자를 사용합니다.
<syntaxhighlight lang="cpp">
#include <algorithm>
 
// 정렬
sort(v.begin(), v.end());
 
// 역순 정렬
sort(v.begin(), v.end(), greater<int>());
 
// 특정 값 찾기
auto it = find(v.begin(), v.end(), 3);
if(it != v.end()) {
    cout << "값 3을 찾았습니다! 위치: " << (it - v.begin()) << endl;
}
 
// 요소 개수 세기
int count_of_twos = count(v.begin(), v.end(), 2);
</syntaxhighlight>
 
== 성능 특성 ==
 
* 임의 접근: O(1)
* 끝에 요소 추가/제거: 상환 O(1)
* 중간에 요소 삽입/제거: O(n)
* 검색: O(n)
 
Vector는 임의 접근이 빈번하거나 끝에서의 삽입/삭제가 주로 필요한 경우 효율적인 자료구조입니다.
 
== 실제 사용 예제 ==


<syntaxhighlight lang="cpp">
<syntaxhighlight lang="cpp">
#include <iostream>
#include <iostream>
#include <vector>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
using namespace std;


int main() {
int main() {
    // 문자열 vector 생성
     vector<int> v = {1, 2, 3};
     vector<string> names = {"Kim", "Park", "Lee"};
 
   
     // 반복자(iterator)를 사용한 벡터 원소 출력
     // 요소 추가
     vector<int>::iterator iter;
    names.push_back("Choi");
     for(iter = v.begin(); iter != v.end(); iter++) {
     names.push_back("Jung");
         cout << *iter << endl;
      
    // 정렬
    sort(names.begin(), names.end());
   
    // 출력
    cout << "이름 목록 (알파벳 순):" << endl;
    for(const auto& name : names) {
         cout << name << endl;
     }
     }
   
 
    // 특정 요소 검색
    string search_name = "Park";
    auto it = find(names.begin(), names.end(), search_name);
   
    if(it != names.end()) {
        cout << search_name << "은(는) 목록의 "
            << (it - names.begin() + 1) << "번째에 있습니다." << endl;
    } else {
        cout << search_name << "은(는) 목록에 없습니다." << endl;
    }
   
     return 0;
     return 0;
}
}
</syntaxhighlight>
</syntaxhighlight>


== 주의사항 ==
결과:
<pre>
1
2
3
</pre>


# Iterator Invalidation: vector의 크기를 변경하는 작업(push_back, resize 등)은 반복자를 무효화할 수 있습니다.
== 요약 정리 ==
# 재할당: capacity를 초과하면 메모리 재할당이 발생하여 성능에 영향을 줄 수 있습니다. 필요한 경우 미리 <code>reserve()</code>를 호출하세요.
* 벡터는 크기가 자동으로 관리되는 편리한 배열이다.
# 잘못된 접근: <code>[]</code> 연산자는 범위 검사를 하지 않으므로 주의해야 합니다. 안전한 접근이 필요하면 <code>at()</code> 메서드를 사용하세요.
* '''push_back()''', '''pop_back()'''으로 쉽게 데이터 추가/삭제 가능하다.
* '''size()''', '''empty()''' 등을 통해 쉽게 상태를 확인할 수 있다.
* 반복자(iterator)를 이용하면 원소 접근과 관리가 더욱 편리하다.


== 참고 자료 ==
== 참고 자료 ==
* [https://en.cppreference.com/w/cpp/container/vector C++ Reference]
* [https://blockdmask.tistory.com/70 Vector 자세한 설명]
* [https://blockdmask.tistory.com/70 원본 블로그]


[[분류:C++]]
[[분류:C++]]
[[분류:STL]]
[[분류:프로그래밍]]
[[분류:컨테이너]]

2025년 4월 26일 (토) 13:07 기준 최신판

[C++] Vector 컨테이너 기초

Vector는 C++에서 제공하는 자료구조로, 자동으로 메모리를 관리해 주는 동적 배열입니다. 일반적인 배열과 다르게 크기가 자동으로 늘어나거나 줄어들 수 있어서 매우 편리합니다.

Vector 특징

  • 자동으로 크기가 늘어나고 줄어듦
  • 데이터의 추가와 제거가 쉬움
  • 인덱스로 바로 접근 가능 (배열처럼 사용 가능)
  • 내부적으로 연속된 메모리 공간에 저장됨

기본 사용법

먼저 <vector> 헤더 파일을 포함해야 합니다.

#include <vector>

다음과 같이 벡터를 선언합니다. (데이터 타입을 정해야 합니다)

vector<int> v;         // 정수형 벡터 생성
vector<string> s;      // 문자열 벡터 생성

주요 기능 (함수)

벡터에서 자주 사용하는 함수는 다음과 같습니다.

함수 설명 사용법 예시
push_back() 벡터 끝에 원소 추가 v.push_back(10);
pop_back() 벡터 끝의 원소 제거 v.pop_back();
at() 특정 위치 원소 접근 (안전한 방법, 범위 체크 있음) v.at(0);
[ ] 특정 위치 원소 접근 (빠른 방법, 범위 체크 없음) v[0];
front() 첫 번째 원소 참조 v.front();
back() 마지막 원소 참조 v.back();
clear() 벡터의 모든 원소 삭제 v.clear();
size() 원소 개수 확인 v.size();
capacity() 할당된 메모리 크기 확인 v.capacity();
empty() 벡터가 비어있는지 확인 (true 또는 false 반환) v.empty();
resize(n) 벡터 크기를 n으로 변경 (크기를 늘릴 경우 기본값으로 채움) v.resize(5);
assign(n, value) 벡터를 n개의 원소로 채우고 각 원소를 value로 설정 v.assign(3, 7);

size와 capacity의 차이점

  • size는 현재 실제 저장된 원소의 개수
  • capacity는 실제 할당된 전체 메모리 공간 크기

Vector를 사용한 간단한 예제

다음은 간단한 벡터 사용 예제입니다.

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> v;  // 정수형 벡터 생성

    v.push_back(1); // 벡터에 1 추가
    v.push_back(2); // 벡터에 2 추가
    v.push_back(3); // 벡터에 3 추가

    // 벡터의 모든 원소 출력 (for문 사용)
    for(int i = 0; i < v.size(); i++) {
        cout << v[i] << endl;
    }

    return 0;
}

결과:

1
2
3

Iterator(반복자)를 이용한 출력 예제

벡터를 더 간단히 순회할 수 있는 방법으로 반복자를 사용합니다.

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> v = {1, 2, 3};

    // 반복자(iterator)를 사용한 벡터 원소 출력
    vector<int>::iterator iter;
    for(iter = v.begin(); iter != v.end(); iter++) {
        cout << *iter << endl;
    }

    return 0;
}

결과:

1
2
3

요약 정리

  • 벡터는 크기가 자동으로 관리되는 편리한 배열이다.
  • push_back(), pop_back()으로 쉽게 데이터 추가/삭제 가능하다.
  • size(), empty() 등을 통해 쉽게 상태를 확인할 수 있다.
  • 반복자(iterator)를 이용하면 원소 접근과 관리가 더욱 편리하다.

참고 자료