Language/C++

(C++)배열 초기화-memset,fill

doheun 2023. 2. 8. 17:32
반응형

fill() & memset()

fill()

배열을 0 이외의 값으로 초기화 시 사용

  • 배열
    fill(초기화 시키고 싶은 시작주소, 끝주소, 초기화 값)

    헤더

    #include <algorithm>

    vector

    벡터는 맨처음 초기화 하지 않고 실행시 오류가 뜬다. 왜냐하면 동적배열이기 때문에 초반에 어떤 크기인지 알 수 없기 떄문이다. 따라서 문제에서 주어진 값을 먼저 넣고 초기화 할 때 사용하는 것이 좋음

    1차원

    using namespace std;
    const int max_n =8;
    vector<int> v;
    int main() {
      //1차원 벡터 
      for (int i = 0; i < max_n; i++) {
          v.push_back(i);
      }
      for (auto ele : v) {
          cout << ele << ' ';
      }
      cout << '\n';
      fill(v.begin(), v.end(), 10);
      for (auto ele : v) {
          cout << ele << ' ';
      }
      cout << '\n';
    }
    //출력
    0 1 2 3 4 5 6 7 
    10 10 10 10 10 10 10 10 

2차원

2차원 벡터는 vector<vector> 형태를 한번에 초기화 하면 오류 뜸. vector를 하나의 행으로 보고 열의 개수만큼 각각의 행을 초기화하는데 사실 2차원 벡터를 초기화 시키는 것보단 2차원 배열로 한번에 초기화 시키는 방법을 많이 사용

using namespace std;
const int max_n =8;
vector<int> v;
vector<vector<int>> vv;
int main() {
    //1차원 벡터 
    for (int i = 0; i < max_n; i++) {
        v.push_back(i);
    }
    //2차원벡터
    for (int i = 0; i < max_n; i++) {
        vv.push_back(v);
    }
    for (int i = 0; i < max_n; i++) {
        for (int j = 0; j < max_n; j++) {
            cout << vv[i][j] << ' ';
        }
        cout << '\n';
    }
    cout << '\n';

    for (int i = 0; i < max_n; i++) {
        fill(&vv[i][0], &vv[i][0] + max_n, 5);
    }

    for (int i = 0; i < max_n; i++) {
        for (int j = 0; j < max_n; j++) {
            cout << vv[i][j] << ' ';
        }
        cout << '\n';
    }
    cout << '\n';
}
//출력
0 1 2 3 4 5 6 7 
0 1 2 3 4 5 6 7 
0 1 2 3 4 5 6 7 
0 1 2 3 4 5 6 7 
0 1 2 3 4 5 6 7 
0 1 2 3 4 5 6 7 
0 1 2 3 4 5 6 7 
0 1 2 3 4 5 6 7 

5 5 5 5 5 5 5 5 
5 5 5 5 5 5 5 5 
5 5 5 5 5 5 5 5 
5 5 5 5 5 5 5 5 
5 5 5 5 5 5 5 5 
5 5 5 5 5 5 5 5 
5 5 5 5 5 5 5 5 
5 5 5 5 5 5 5 5 

배열(1차원,2차원)

배열은 vector와 다르게 값이 없어도 max_n으로 크기가 정해져 있기 때문에 바로 fill사용 가능 , 2차원의 경우 시작주소와,끝주소를 통해 초기화가 가능

using namespace std;
const int max_n =8;
int a[max_n];
int aa[max_n][max_n];

//fill()을 이용해서 0이외의 값으로 초기화
int main() {

    fill(a, a + max_n, 10);
    for (int i = 0; i < max_n; i++) {
        cout << a[i] << ' ';
    }
    cout << '\n';
    cout << '\n';

    fill(&aa[0][0], &aa[0][0] + max_n * max_n, 20);
    for (int i = 0; i < max_n; i++) {
        for (int j = 0; j < max_n; j++) {
            cout << aa[i][j] << ' ';
        }
        cout << '\n';
    }
    cout << '\n';


    return 0;
}
//출력
10 10 10 10 10 10 10 10 

20 20 20 20 20 20 20 20 
20 20 20 20 20 20 20 20 
20 20 20 20 20 20 20 20 
20 20 20 20 20 20 20 20 
20 20 20 20 20 20 20 20 
20 20 20 20 20 20 20 20 
20 20 20 20 20 20 20 20 
20 20 20 20 20 20 20 20 

memset()

배열 전체를 0으로 초기화 시 많이 사용

  • 배열의 크기는 보통 sizeof(배열)
memset(배열이름,초기화 값, 배열크기)

헤더

#include<cstring>

배열(1차원)

using namespace std;
const int max_n =8;
int a[max_n];
int aa[max_n][max_n];

//fill()을 이용해서 0이외의 값으로 초기화
int main() {
    for (int i = 0; i < max_n; i++) {
        a[i] = i;
    }
    for (auto ele : a) {
        cout << ele << ' ';
    }
    cout << '\n';
    cout << '\n';
    memset(a, 0, sizeof(a));
    for (auto ele : a) {
        cout << ele << ' ';
    }
    cout << '\n';

    return 0;
}
//출력
0 1 2 3 4 5 6 7 

0 0 0 0 0 0 0 0 

배열(2차원)

using namespace std;
const int max_n =8;
int a[max_n];
int aa[max_n][max_n];

//fill()을 이용해서 0이외의 값으로 초기화
int main() {
    for (int i = 0; i < max_n; i++) {
        for (int j = 0; j < max_n; j++) {
            aa[i][j] = i + j+10;
        }
    }
    for (int i = 0; i < max_n; i++) {
        for (int j = 0; j < max_n; j++) {
            cout << aa[i][j] << ' ';
        }
        cout << '\n';
    }
    cout << '\n';
    memset(aa, 0, sizeof(aa));
    for (int i = 0; i < max_n; i++) {
        for (int j = 0; j < max_n; j++) {
            cout << aa[i][j] << ' ';
        }
        cout << '\n';
    }
    return 0;
}
//출력
10 11 12 13 14 15 16 17 
11 12 13 14 15 16 17 18 
12 13 14 15 16 17 18 19 
13 14 15 16 17 18 19 20 
14 15 16 17 18 19 20 21 
15 16 17 18 19 20 21 22 
16 17 18 19 20 21 22 23 
17 18 19 20 21 22 23 24 

0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 

vector

일반적으로 memset은 배열을 바이트단위로 초기화 하며 0,-1,char형의 하나의 문자로 초기화 할 때만 사용
1이나 다른 수로는 초기화를 할 수 없음

반응형