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:

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:

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:

// 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,

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) —

312 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() (AMP Version)

Leave a Reply