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:
C++ Coding Reference: next_permutation() and prev_permutation()
C++ Coding Reference: count and count_if
How to Reorder Data in Log Files using the Custom Sorting Algori
C++ Coding Reference: std::accumulate() and examples
C++ Coding Reference: sort() and stable_sort()
The C++ Function using STL to Check Duplicate Elements/Character
How to Find Positive Integer Solution for a Given Equation using
How to Implement the instanceof in Javascript?
Azerbaijani Blogger, Mehman Huseynov Sentenced To Prison For All
Fitness Blog Shows Us All How Transformation Photos Can Be Decei
Share:Facebook Twitter
Comment list
Comment add