C++ Coding Reference: Filling a Range with a Value using std::fill()


The C++ fill is provided in xutility and it allows us to copy a value into a range either vector or array. The std::fill() is defined using template:

1
2
3
4
5
6
7
template<class _FwdIt,
    class _Ty> inline
    void fill(_FwdIt _First, _FwdIt _Last, const _Ty& _Val)
    {   // copy _Val through [_First, _Last)
    _Adl_verify_range(_First, _Last);
    _Fill_unchecked(_Get_unwrapped(_First), _Get_unwrapped(_Last), _Val);
    }
template<class _FwdIt,
	class _Ty> inline
	void fill(_FwdIt _First, _FwdIt _Last, const _Ty& _Val)
	{	// copy _Val through [_First, _Last)
	_Adl_verify_range(_First, _Last);
	_Fill_unchecked(_Get_unwrapped(_First), _Get_unwrapped(_Last), _Val);
	}

One possible implementation could be:

1
2
3
4
5
6
7
8
9
10
11
12
template<class _FwdIt,
    class _Ty> inline
    void fill_me(_FwdIt _First, _FwdIt _Last, _Ty _Val)
{   // apply _Val into [_First, _Last)
    _Adl_verify_range(_First, _Last);
    auto _UFirst = _Get_unwrapped(_First);
    const auto _ULast = _Get_unwrapped(_Last);
    for (; _UFirst != _ULast; ++_UFirst)
    {
        *_UFirst = _Val;
    }
}
template<class _FwdIt,
	class _Ty> inline
	void fill_me(_FwdIt _First, _FwdIt _Last, _Ty _Val)
{	// apply _Val into [_First, _Last)
	_Adl_verify_range(_First, _Last);
	auto _UFirst = _Get_unwrapped(_First);
	const auto _ULast = _Get_unwrapped(_Last);
	for (; _UFirst != _ULast; ++_UFirst)
	{
		*_UFirst = _Val;
	}
}

Example usage:

1
2
3
4
5
6
7
8
9
10
11
// using std::fill on integers
int nums[5];
std::fill(begin(nums), end(nums), 2); // nums is now [2, 2, 2, 2, 2]
 
// using std::fill on doubles
vector<double>vals(5);
std::fill(begin(vals), end(vals), 1.5); // vals is now [1.5, 1.5, 1.5, 1.5, 1.5]
 
// using std::fill on characters
char buf[6];
fill(begin(buf), end(buf), 'a'); // buf is now ['a', 'a', 'a', 'a', 'a', 'a']
// using std::fill on integers
int nums[5];
std::fill(begin(nums), end(nums), 2); // nums is now [2, 2, 2, 2, 2]

// using std::fill on doubles
vector<double>vals(5);
std::fill(begin(vals), end(vals), 1.5); // vals is now [1.5, 1.5, 1.5, 1.5, 1.5]

// using std::fill on characters
char buf[6];
fill(begin(buf), end(buf), 'a'); // buf is now ['a', 'a', 'a', 'a', 'a', 'a']

To compute the increasing values into range [first, last), we can use the std::iota() instead.

You can use std::fill() to copy over custom data types such as structs. For example,

1
2
3
4
5
6
typedef struct {
    int x, y, z;
} custom_data_type;
vector<custom_data_type> arr(10);
data x = { 1, 2, 3 };
std::fill(begin(arr), end(arr), x);
typedef struct {
	int x, y, z;
} custom_data_type;
vector<custom_data_type> arr(10);
data x = { 1, 2, 3 };
std::fill(begin(arr), end(arr), x);

To copy over a specific number of elements, you could use std::fill_n() instead.

–EOF (The Ultimate Computing & Technology Blog) —

GD Star Rating
loading...
329 words
Last Post: How to Get List of IP addresses in BASH using hostname and tr commands?
Next Post: C++ Advanced Topics: 10 Questions

The Permanent URL is: C++ Coding Reference: Filling a Range with a Value using std::fill()

Leave a Reply