C++ 算法 fill_n()函数
C++ Algorithm fill_n() 函数用于将指定数量的元素从特定元素开始的范围内赋予新值。
这意味着在fill_n()中,我们指定了起始位置,要填充的元素数量和要填充的值。
语法
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
参数
first :一个输出迭代器,指向要赋值为val的范围的第一个元素的位置。
val :用于填充范围的值。
n :要填充的元素数量,可以为有符号或无符号整数类型。
返回值
fill_n()的第一个版本返回无,第二个版本返回一个迭代器,指向最后一个被填充的元素之后的元素。
复杂度
复杂度为n的线性,同时会给每个元素赋值。
数据竞争
被first指向的范围中的前n个对象被修改。
异常安全
如果元素赋值或迭代器操作引发异常,该函数会抛出异常。
请注意,无效的参数会导致未定义的行为。
示例1
让我们看一个简单的示例来演示fill_n()的用法:
#include <algorithm>
#include <iostream>
#include <iterator>
using namespace std;
int main() {
fill_n(ostream_iterator<int>(cout, ","), 10, 3);
return 0;
}
输出:
3,3,3,3,3,3,3,3,3,3,
示例2
让我们看另一个简单的示例:
#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;
}
输出:
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 )
示例3
让我们看另一个简单的示例:
#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;
}
输出:
1 1 1 0 0 0 0 0
1 1 1 4 4 4 0 0
示例4
让我们看看另一个简单的示例:
#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;
}
输出:
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