C++ Coding Reference: Filling a Range with a Value using std::fi

  • 时间:2020-09-17 11:25:43
  • 分类:网络文摘
  • 阅读:143 次

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

推荐阅读:
Don’t Fall Victim to the Content Overproduction Trap  Are You Taking Advantage Of These Free WordPress Marketing Plugi  What Content Marketers Can Learn from Game of Thrones  All You Need To Know About How Small Business Should Handle Soci  Should You Add Live Chat to Your Blog?  Food Blogger Accuses Fast Food Giant Of Stealing His Recipe  Back To School 2016: How To Rock (And Profit) With Sales And Mar  The Five Fundamentals to Creating a Powerhouse Blog  Blog On The Go With These Mobile Apps  Here’s Why Your Content is Struggling 
评论列表
添加评论