본문 바로가기
프로그래밍 언어/C++

[C++] [STL] fill 함수 사용해보기

by 까망 하르방 2021. 9. 11.
반응형

template <class ForwardIteratorclass T>

void fill(ForwardIterator firstForwardIterator lastconst T& val);

 

- first 채우고자 하는 iterator 시작위치 (first 포함된다.)

- last: 채우고자 하는 iterator 끝위치 (last 포함되지 않는다.)

- val: [first, last)까지 채우고자 하는 값

          대입을 위해 operator= 연산자가 사용된다.

* 헤더파일 #include <algorithm> 필요

 

예제 코드

fill은 보통 배열(array)나 벡터(vector)에 주로 이용합니다.

 

예제- - Array

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

int main() {
       // 0 0 0 0 0
       int arr[5] = {};

       // 7 7 7 0 0
       fill(arr, arr + 3, 7);

       for (int i = 0; i < 5; i++) {
              cout << arr[i] << " ";
       }
       cout << endl;
}

 

예제- - Vector

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

int main()
{
    // vector: 0 0 0 0 0 0 0 0
    vector<int> vec(8);

    // myvector: 0 7 7 7 0 0 0 0
    fill(vec.begin() + 1, vec.begin() + 4, 7);

    for (vector<int>::iterator it = vec.begin(); it != vec.end(); ++it)
    {
        cout << ' ' << *it;
    }
    cout << '\n';
}

 

내부

template <class ForwardIterator, class T>
void fill(ForwardIterator first, ForwardIterator last, const T& val) {
  while (first != last) {
    *first = val;
    ++first;
  }
}

 

예제 - 2차원 배열 채우기

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

const int N = 4;
const int M = 10;
int arr[N][M] = { 0, };

void printArr()
{
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++)
        {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
    puts("");
}

int main(void)
{
    // ----------------------------------
    // 전체 초기화; [0][0] ~ [최대 행 - 1][최대 열]
    // ----------------------------------
    fill(&arr[0][0], &arr[N - 1][M], 7);
    printArr();

    fill(&arr[0][0], &arr[N][0], 3); // [N][0] 이전까지 이므로 arr[N-1][M]  까지이다.
    printArr();

    fill(&arr[0][0], &(arr[0][0]) + N * M, 5);
    printArr();

    memset(arr, 0, sizeof(arr));
    printArr();

    // ----------------------------------
    // 일부분 초기화 : [0][0] ~ [행 범위 지정][열 범위 지정]
    // ----------------------------------
    fill(&arr[0][0], &arr[0 + 2][0 + 3], 1);
    printArr();
}

 

memset 함수와 차이는?

▶ memset 함수 사용 

▶ memset 사용시 주의사항 

memset 은 1 Byte 단위로 값을 처리하기 때문에 

「0」 이 아닌 숫자를 사용할 때, 예상치 않은 결과가 발생할 수 있다.

fill 은 byte 단위로 처리하는 것이 아니기 때문에 이를 처리할 수 있다.

 

「0」, 「false」 과 같은 값은 memset 으로도 처리하면 되지만

그 외의 값을 처리할 때 fill 을 활용하는 편이다.

반응형

댓글