프로그래밍/C++ 문법

C++에서 memset, fill, fill_n 함수 알아보기

studylida 2023. 1. 6. 21:00

1. memset

<cstring>에 의해 정의되어 있으며, 메모리 블록을 채우는 기능을 하는 함수이다. 매개변수는 채우고자 하는 메모리 블럭을 가리키는 pt, 채워지는 값인 value, 그리고 채울 바이트 수를 의미하는 num이 있다. 이를 통해 memset 함수는 ptr이 가리키는 메모리 블럭부터 num 바이트만큼을 value로 채우는 기능을 한다는 것을 알 수 있다. 이때 value는 unsigned char로 바뀌어 사용된다. 기능에 성공하면 인자로 들어간 ptr을 리턴하고 실패하면 NULL을 반환한다.

memset(arr, 0, sizeof(int) \* 32)와 같이 사용할 수 있다.

주의사항

배열의 타입이 1byte 자료형이 아닌 경우에는 0 이외의 값으로 초기화하면 제대로 초기화되지 않는다(1바이트 단위로 초기화하기 때문이다). memset(arr,1,sizeof(int)\*32)와 같이 사용하게 되면 배열의 각 인덱스를 참조했을 때, 16843009라는 값으로 초기화되어있는 것을 확인할 수 있다.

2. std::fill

<algorithm>에 의해 정의되어 있으며, 정해진 범위에 값을 할당하는 기능을 하는 함수이다. 매개변수는 할당범위의 시작을 가리키는 first, 할당범위의 끝 다음을 가리키는 last, 그리고 할당하고자 하는 값 value가 있다. 이를 통해 std::fill 함수는 [first, last)에 value를 할당하는 기능을 한다는 것을 알 수 있다. 함수의 동작은 다음 코드블럭에 쓰여진 것과 같다. 리턴값은 없다.

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

배열의 경우에는 std::fill(alphabet, alphabet+26, -1)과 같이 사용할 수 있고,
벡터의 경우에는 std::fill(v1.begin(), v1.end(),-1)과 같이 사용할 수 있다.

complexity

std::distance(first,last)

exception

Throws if either an element assignment or an operation on an iterator throws.
Note that invalid arguments cause undefined behavior.

3. std::fill_n

<algorithm>에 의해 정의되어 있으며, 정해진 범위에 값을 할당하는 기능을 하는 함수이다(The n first objects at the range pointed by first are modified). 매개변수는 값이 채워질 첫 위치를 가리키는 output iterators인 first, 채울 원소의 개수를 의미하는 n, 그리고 n만큼의 범위를 채우는 데 사용할 값인 value가 있다. n은 음수여서는 안되며(C++98), 만약 음수라면 함수는 작동하지 않는다(C++11). C++98 기준으로는 아무 값도 반환하지 않으며, C++11 기준으로는 채워진 마지막 원소를 가리키는 iterator가 반환된다. 함수의 동작은 다음 코드블럭에 쓰여진 것과 같다.

template <class OutputIterator, class Size, class T>
  OutputIterator fill_n (OutputIterator first, Size n, const T& val)
{
  while (n>0) {
    *first = val;
    ++first; --n;
  }
  return first;     // since C++11
}

배열의 경우에는 std::fill\_n(alphabet, 26, -1)과 같이 사용할 수 있고,
벡터의 경우에는 std::fill\_n(alphabet.begin(), 26,-1)과 같이 사용할 수 있다.

complexity
std::max(0,count)
exception

Throws if either an element assignment or an operation on an iterator throws.
Note that invalid arguments cause undefined behavior.