C++ Coding Reference: iota() – Setting Incrementing Values
- Time:2020-09-17 11:25:43
- Class:Weblog
- Read:25
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:Summits set epoch-making milestone in history of China-Arab ties
In the face of COVID-19 pandemic, China and Arab countries have
15 Macao residents qualify as candidates for deputies to nationa
Study finds genetic solution to pre-harvest sprouting in rice, w
Bodybuilders dying as coaches, judges encourage extreme measures
Malta's Marsaskala, China's Dujiangyan sign sister city agreemen
U.S. mortgage applications continue slide amid surging interest
Russian, UAE presidents discuss bilateral cooperation over phone
Hate crimes in U.S. Los Angeles County rise to highest level sin
Chinese mainland reports 4,031 new local confirmed COVID-19 case
- Comment list
-
- Comment add