C++ Coding Reference: iota() – Setting Incrementing Values

  • Time:2020-09-17 11:25:43
  • Class:Weblog
  • Read:31

The C++ method iota (not to be confused with itoa which is to convert integers to string), is defined in header numeric. Its purpose is to compute increasing values into a range of values such as vector or arrays.

Syntactically, it has the following function signature with generic template in numeric:

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

As we can see, the iota takes three parameters: The First, the Last, and the Value. The iota will then set the values within the range [First, Last) with the values incrementing from Value.

1
2
3
4
5
6
7
*(_first + 0) = _Val;
*(_first + 1) = ++_Val;
*(_first + 2) = ++_Val;
*(_first + 3) = ++_Val;
...
...
*(_last - 1) = ++_Val;
*(_first + 0) = _Val;
*(_first + 1) = ++_Val;
*(_first + 2) = ++_Val;
*(_first + 3) = ++_Val;
...
...
*(_last - 1) = ++_Val;

The Last iterator is always one element (position) beyond the actual last element of the range (vector or array).

Using iota on Vectors

The following C++ example initialize a vector of type integer with 10 elements (all zeros). After iota with starting value -5, the vector becomes [-5 -4 -3 -2 -1 0 1 2 3 4].

1
2
vector<int> nums(10);
iota(begin(nums), end(nums), -5); // [-5 -4 -3 -2 -1 0 1 2 3 4]
vector<int> nums(10);
iota(begin(nums), end(nums), -5); // [-5 -4 -3 -2 -1 0 1 2 3 4]

As the begin() and end() can be used on the arrays, we can apply the increasing sequence on the arrays as well:

1
2
int nums[10];
iota(begin(nums), end(nums), -5); // [-5 -4 -3 -2 -1 0 1 2 3 4]
int nums[10];
iota(begin(nums), end(nums), -5); // [-5 -4 -3 -2 -1 0 1 2 3 4]

Not just integers, doubles/floats are also welcome!

1
2
3
vector<double> nums(10);
// [-0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5]
iota(begin(nums), end(nums), -0.5); 
vector<double> nums(10);
// [-0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5]
iota(begin(nums), end(nums), -0.5); 

If you want to apply single values to a range of either vector or arrays, you may want to use the std::fill() instead.

–EOF (The Ultimate Computing & Technology Blog) —

Recommend:
How to Set Up Your On-Call Duty when Your Steem Witness is Missi
Common Mistakes You Can Face With Trying to switch Your Hosting
Recursive Algorithm to Construct Binary Tree from Preorder and P
10 Common Reasons Why Your Blog Doesn’t Make Money
Trial Run During COVID: Tips for Transitioning to a Full-time Fr
Why You Need Multiple Streams of Income
What You Should Know About Being A Freelance Blogger
When a Blogger Needs a Lawyer
Fitness Tips for Busy Bloggers and Other E-Professionals
How to Use Goals to Keep on Blogging
Share:Facebook Twitter
Comment list
Comment add