개발자공부일기

vector 본문

Language/C++

vector

JavaCPP 2025. 3. 20. 15:22

행렬의 크기를 입력받고 두 행렬의 값들을 입력받아 두 행렬을 더하는 백준문제를 다음과 같은 코드로 풀었다.

#include <iostream>

using namespace std;

int main(void)
{
    int n=0,m=0;

    cin>>n;
    cin>>m;

    int A[n][m],B[n][m],C[n][m];

    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cin>>A[i][j];
        }
    }

    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cin>>B[i][j];
        }
    }

    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            C[i][j] = A[i][j] +B[i][j];
        }
    }

    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cout<<C[i][j]<<" ";
        }
        cout<<endl;
    }

    return 0;
}

근데 뭔가 찜찜해서 GPT한테 피드백을 받아보니 

코드를 보면 동적으로 크기가 정해지는 2차원 배열을 선언하고 있습니다. 하지만 C++에서는 가변 길이 배열(VLA, Variable Length Array)을 공식적으로 지원하지 않습니다. 즉, int A[n][m];처럼 동적으로 크기가 결정되는 배열을 선언하는 것은 표준 C++에서 허용되지 않습니다.

라고 한다. 지원하지 않는데 백준에서 왜 통과됐는지는 모르겠다.

그래서 vector 또는 동적할당을 쓰는걸 추천한다고 했는데, vector라는 친구가 뭐 하는 친구인지 알아보려 한다.

 

Vector란?

vector는 C++의 표준 라이브러리에서 제공하는 동적 배열 컨테이너다.

C++에서 일반적인 배열(int arr[30])과 달리 크기를 동적으로 조절할 수 있으며, 동적할당과 달리 메모리 해제를 해줄 필요가 없이 메모리 관리가 자동으로 이루어진다.굉장히 편하지 않은가?

vector의 특징

  1. 동적 크기 조절 가능
    • 배열과 다르게 크기를 미리 지정할 필요 없음 (push_back()으로 요소 추가 가능)
  2. 배열과 유사한 접근 방식
    • 인덱스를 사용하여 요소에 접근 가능 (v[i])
  3. 메모리 자동 관리
    • 더 많은 원소가 추가될 경우 자동으로 크기를 늘리고, 필요 없으면 해제됨.
  4. 다양한 멤버 함수 제공
    • push_back(), pop_back(), size(), resize(), clear() 등 다양한 기능 지원.

 

사용법

선언하기

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> v(5);  // 크기가 5인 vector 생성 (초기값: 0)
    // vector<vector<int>> arr(n, vector<int>(m)); 2차원 배열 선언하는 법
    
    for (int i = 0; i < 5; i++) {
        cout << v[i] << " ";  // 0 0 0 0 0 (기본값)
    }

    return 0;
}

 

동적 크기 변경

vector<int> v;  // 빈 벡터 생성

v.push_back(10);  // {10}
v.push_back(20);  // {10, 20}
v.push_back(30);  // {10, 20, 30}

cout << v[1];  // 20 (두 번째 원소 출력)

 

주요 함수 

함수 설명
push_back(x) 맨 뒤에 x 추가
pop_back() 맨 뒤 원소 제거
size() 원소 개수 반환
resize(n) 크기를 n으로 변경
clear() 모든 원소 삭제
empty() 비어 있으면 true, 아니면 false 반환
front() 첫 번째 원소 반환
back() 마지막 원소 반환

 

바뀐 코드

내 문제풀이 코드에서 vector로 바꿔서 적용해봤다.

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int n, m;
    cin >> n >> m;

    vector<vector<int>> A(n, vector<int>(m));
    vector<vector<int>> B(n, vector<int>(m));
    vector<vector<int>> C(n, vector<int>(m));

    // A 입력
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> A[i][j];
        }
    }

    // B 입력
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> B[i][j];
        }
    }

    // 행렬 덧셈
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            C[i][j] = A[i][j] + B[i][j];
        }
    }

    // 결과 출력
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cout << C[i][j] << " ";
        }
        cout << endl;
    }

    return 0;
}

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

c++란?  (0) 2025.04.29