티스토리 뷰

벡터(Vector)란?

크기가 변할 수 있는 배열을 나타내는 시퀀스 컨테이너이다. 
Vectors are sequence containers representing arrays that can change in size.
쉽게 말해 동적으로 그 사이즈를 조절 가능할 수 있는 배열을 의미한다.

 

벡터를 사용하기 위해서는 <vector> 헤더를 include 해주어야 한다.
편의상 아래 코드에 vector 헤더와 using namespace std; 선언을 해주었다고 가정한다. 

#include <vector>
using namespace std;

1차원 벡터 선언 및 초기화

기본 벡터 선언 방법이다. 내부 자료형을 int로 하는 벡터 v를 선언한다.  이때는 비어있는 벡터 v가 생성된다. 
당연히 비어있기 때문에 사이즈도 0이다.

 

    vector<int> v;
    cout << v.size(); // 실행 결과 : 0

 

크기가 5인 벡터의 선언 방법이다. 이때 요소들의 기본 값은 0이다.

 

    vector<int> v(5);
    cout << v.size(); // 실행결과 5
    cout << v[0] << ' ' <<v[1] << endl; // 실행결과 0 0

 

크기가 5이고, 벡터 요소들의 값을 동시에 3으로 초기화하는 선언 방법이다.

 

    vector<int> v(5, 3);
    cout << v.size(); // 실행결과 5
    cout << v[0] << ' ' <<v[1] << endl; // 실행결과 3 3

 

다른 벡터를 복사해서 생성하는 방법이다.

 

    vector<int> v(5, 3);
    cout << v.size(); // 실행결과 5
    cout << v[0] << ' ' <<v[1] << endl; // 실행결과 3 3
    
    vector<int> copy(v);
    cout << copy.size(); // 실형결과 5
    cout << copy[0] << ' ' << copy[1] << endl; // 실행결과 3 3

2차원 벡터 선언 및 초기화

    vector<int> v;

 

이 의미는 요소들의 자료형이 int인 벡터 v를 선언한다는 의미이다.
그렇다면 2차원 벡터의 경우 요소들이 벡터 여야 한다. 다시 말해 2차원 벡터 matrix를 선언한다고 할 때,

 

// 설명을 위한 코드입니다 실행불가
vector<> matrix = { 
    vector<> v1, 
    vector<> v2, 
    vector<> v3 
}

 

이런 식으로 구성이 된다는 것이고, 요소들이 모두 벡터이다. 그렇다면 matrix의 요소에 vector <>가 들어가야 할 것이다. 

 

// 설명을 위한 코드입니다 실행불가
vector<vector<>> matrix = { 
    vector<> v1, 
    vector<> v2, 
    vector<> v3 
}

 

결론적으로, 각 요소 벡터들이 int 자료형을 가지는 데이터를 요소로 가진다고 하였을 때, 아래와 같이 구성될 것이다. 

 

// 설명을 위한 코드입니다 실행불가
vector<vector<int>> matrix = { 
    vector<int> v1, 
    vector<int> v2, 
    vector<int> v3 
}

 

따라서, 다시 2차원 배열 선언으로 돌아가면

 

    vector<vector<int>> matrix;
    cout << matrix.size(); // 실행결과 0

 

위 코드는 'int 자료형 데이터를 요소를 가지는 벡터'들을 요소로 가지는 벡터 matrix이다. 다만 아무런 초기화를 진행하지 않았기 때문에 그냥 빈 배열이다. 즉, 현재 matrix 상태는 {}와 다를 게 없다.

 

여기서 벡터 assign을 활용한다면,

 

    vector<vector<int>> matrix(5);
    cout << matrix.size(); // 실행결과 5

 

5개의 원소를 가지는 matrix, 여기까지의 matrix상태는 {{}, {}, {}, {}, {}}이다.
그렇다면 각 원소인 int를 자료형으로 가지는 벡터 요소들까지 초기화해준다면?

 

    vector<vector<int>> matrix(5, vector<int> (5,3));
    cout << matrix.size() << endl; // 실행결과 5
    
    for(int i=0; i<matrix.size();i++){
        for(int j=0; j<matrix[0].size(); j++){
            cout << matrix[i][j] << ' ';   
        }
        cout<<endl;
    }
    // 실행결과 
    // 3 3 3 3 3
    // 3 3 3 3 3 
    // 3 3 3 3 3 
    // 3 3 3 3 3 
    // 3 3 3 3 3

matrix 상태는 아래와 같다.
{{3,3,3,3,3},
{3,3,3,3,3},
{3,3,3,3,3},
{3,3,3,3,3},
{3,3,3,3,3}}


2차원 벡터의 선언 후 초기화

벡터를 선언 후, 재 초기화할 일이 없다면 상관없지만, 보통 다시 초기화가 필요할 때 사용할 수 있는 방법들이다. 

 

* init함수 구현 

직접 초기화해주는 방법으로, 벡터의 요소들 마다 특정 규칙으로 다르게 세팅해줘야 한다거나 할 때 사용할 수 있는 방법이다.

void init(vector<vector<int>> &matrix)
{
    for(int i=0; i<matrix.size();i++){
        for(int j=0; j<matrix[0].size(); j++){
            matrix[i][j] = 7;
        }
    }
}

 

* Algorithm 헤더의 fill 사용

fill 함수는 배열이나 벡터 같은 연속성을 띈 자료구조의 시작점부터 연속된 범위를 어떤 값이나 객체로 모두 지정하고 싶을 때 사용하는 함수이다. 함수의 원형은 아래와 같다. 

#include <algorithm>

void fill (ForwardIterator first, ForwardIterator last, const T& val);

 

first는 채우고자 하는 자료구조의 시작 위치, last는 끝 위치이다. val은 채우고자 하는 값으로 객체가 들어갈 수도 있다. 

 

// 처음에는 [0][0]을 써주고, 그 다음 칸에는 [최대 행(값) - 1][최대 열]
fill(&matrix[0][0], &matrix[MAX - 1][MAX], 7);

 

주의할 점은, matrix.begin()과 matrix.end()를 사용하고 싶을 때는, val에 vector를 적어야 한다.

matrix는 2차원 벡터이고, 2차원 벡터의 요소는 벡터이기 때문이다.

 

fill(matrix.begin(), matrix.end(), vector<int> (5,7));

 

 

* memset 사용

memset은 memory.h 헤더를 포함하여 사용한다. 
memset(배열 이름, 초기화 값, 배열 크기); 
보통 1바이트 단위로 메모리를 초기화하기 때문에 배열 값을 0으로 초기화할 때 주로 사용한다. 

 

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

[C++] 비트단위의 데이터 저장방법  (3) 2022.10.06
[C++] C++의 가상함수 동작 원리  (0) 2022.09.16
[C/C++] Hash Table vs STL map  (0) 2022.09.15
Google C/C++ CodeStyle  (0) 2022.08.12
[C/C++] const 개념 한번에 이해하기  (0) 2022.08.04
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함