C++ Algorithm fill_n
The C++ fill_n function is utilized to update a specific number of elements in a sequence starting from a designated element with a new value.
It signifies that in the fill_n function, we define the starting position, the quantity of elements to fill, and the specific value to use for filling.
Syntax
template <class OutputIterator, class Size, class T>
void fill_n (OutputIterator first, Size n, const T& val); //until C++ 11
template <class OutputIterator, class Size, class T>
OutputIterator fill_n (OutputIterator first, Size n, const T& val); //since C++ 11
Parameter
An output iterator pointing to the location of the initial element within the range where the value val will be assigned.
val : Value which is used to fill the range.
n : The number of elements to be filled can be of signed or unsigned integer type.
Return value
The initial implementation of filln returns a null value, while the revised version of filln provides an iterator pointing to the element succeeding the last element that was filled.
Complexity
The time complexity scales linearly with the size of n. It assigns a specific value to every individual element.
Data races
The initial n items within the range indicated by the first pointer are altered.
Exception safety
This function will raise an exception if there is an exception thrown during element assignments or iterator operations.
Please be aware that using incorrect parameters can lead to unpredictable behavior.
Example 1
Let's explore a basic example to illustrate how to utilize the fill_n function:
#include <algorithm>
#include <iostream>
#include <iterator>
using namespace std;
int main() {
fill_n(ostream_iterator<int>(cout, ","), 10, 3);
return 0;
}
Output:
3,3,3,3,3,3,3,3,3,3,
Example 2
Let's see another simple example:
#include <vector>
#include <algorithm>
#include <iostream>
int main()
{
using namespace std;
vector <int> v;
for ( auto i = 0 ; i < 9 ; ++i )
v.push_back( 0 );
cout << " vector v = ( " ;
for ( const auto &w : v )
cout << w << " ";
cout << ")" << endl;
// Fill the first 3 positions with a value of 1, saving position.
auto pos = fill_n( v.begin(), 3, 1 );
cout << "modified v = ( " ;
for ( const auto &w : v )
cout << w << " ";
cout << ")" << endl;
// Fill the next 3 positions with a value of 2, using last position.
fill_n( pos, 3, 2 );
cout << "modified v = ( " ;
for ( const auto &w : v )
cout << w << " ";
cout << ")" << endl;
// Fill the last 3 positions with a value of 3, using relative math.
fill_n( v.end()-3, 3, 3 );
cout << "modified v = ( " ;
for ( const auto &w : v )
cout << w << " ";
cout << ")" << endl;
return 0;
}
Output:
vector v = ( 0 0 0 0 0 0 0 0 0 )
modified v = ( 1 1 1 0 0 0 0 0 0 )
modified v = ( 1 1 1 2 2 2 0 0 0 )
modified v = ( 1 1 1 2 2 2 3 3 3 )
Example 3
Let's see another simple example:
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
vector<int> vect(8);
// calling fill to initialize first four values
// to 7
fill_n(vect.begin(), 3, 1);
for (int i=0; i<vect.size(); i++)
cout << ' ' << vect[i];
cout << '\n';
// calling fill to initialize 3 elements from
// "begin()+3" with value 4
fill_n(vect.begin() + 3, 3, 4);
for (int i=0; i<vect.size(); i++)
cout << ' ' << vect[i];
cout << '\n';
return 0;
}
Output:
1 1 1 0 0 0 0 0
1 1 1 4 4 4 0 0
Example 4
Let's see another simple example:
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
vector <int> vec;
vector <int>::iterator Iter1;
int i;
for (i = 10; i <= 20; i++)
vec.push_back(i);
cout <<"Vector vec data: ";
for (Iter1 = vec.begin(); Iter1 != vec.end(); Iter1++)
cout <<*Iter1<<" ";
cout <<endl;
// fill the last 3 positions for 6 position with a value of 9
cout <<"\nOperation: fill_n(vec.begin() + 3, 6, 9)\n";
fill_n(vec.begin() + 3, 6, 9);
cout <<"Modified vec data: ";
for (Iter1 = vec.begin(); Iter1 != vec.end(); Iter1++)
cout <<*Iter1<<" ";
cout <<endl;
return 0;
}
Output:
Vector vec data: 10 11 12 13 14 15 16 17 18 19 20
Operation: fill_n(vec.begin() + 3, 6, 9)
Modified vec data: 10 11 12 9 9 9 9 9 9 19 20