说明:下列算法如果没有特殊说明,则来自algorithm头文件,对容器批量进行赋值的算法:
- std::generate
- 将gen函数的返回值挨个赋值给[first,last)范围内的容器。等价于:
-
template <class ForwardIterator, class Generator> void generate ( ForwardIterator first, ForwardIterator last, Generator gen ) { while (first != last) { *first = gen(); ++first; } }
参数说明
first,last:分别指的是前向迭代器(forward iterators)的范围。
gen:表示生成函数,可以是函数指针,也可以是函数体,一般可用lambda函数代替。示例
std::vector<int> myvector(8); auto randFunc = []()->int {std::rand() % 100; }; // lambda function std::generate (myvector.begin(), myvector.end(), RandomNumber); // generate function copy (myvector.begin(), myvector.end(), std::ostream_iterator<int>(cout, "")); // output
- std::generate_n
- 该函数给从指定位置开始往后的n个数(包括该位置),使用gen函数的结果赋值。等价于:
-
template <class ForwardIterator, class Generator> void generate ( ForwardIterator first, ForwardIterator last, Generator gen ) { while (first != last) { *first = gen(); ++first; } }
参数说明
first:开始赋值的起始位置。
n:n值表示赋值的个数,其中first参数指向的值为第1个数,first后面的是第2个数,以此类推。如果是负数,则generate_n不会进行赋值。
gen:赋值的产生函数示例
int my_array[9]; int first = 1; auto f = [&first]()->int {return first++; }; std::generate_n (my_array, 10, f); copy (std::begin(my_array), std::end(my_array), std::ostream_iterator<int>(cout, " "));// output
- std::fill
- 该函数用固定的值给容器中全部元素赋值。等价于:
-
template <class ForwardIterator, class T> void fill (ForwardIterator first, ForwardIterator last, const T& val) { while (first != last) { *first = val; ++first; } }
参数说明
first,last:起始位置和结束位置,其中last指向的位置不会被赋值。
val:要赋的值。示例
std::vector<int> myvector (8); // myvector: 0 0 0 0 0 0 0 0 std::fill (myvector.begin(),myvector.begin()+4,5); // myvector: 5 5 5 5 0 0 0 0 std::fill (myvector.begin()+3,myvector.end()-2,8); // myvector: 5 5 5 8 8 8 0 0 copy (std::begin(myvector), std::end(myvector), std::ostream_iterator<int>(cout, " "));// output
- std::fill_n
- 该函数赋值从指定位置开始往后的n个数(包括该位置)赋值,使用固定值赋值。等价于:
-
template <class OutputIterator, class Size, class T> OutputIterator fill_n (OutputIterator first, Size n, const T& val) { while (n>0) { *first = val; ++first; --n; } return first; // since C++11 }
参数说明
first:起始位置。
n:表示包括起始位置后的多少个数。
val:要赋予容器中这些范围中元素的值。示例
std::vector<int> myvector (8,10); // myvector: 10 10 10 10 10 10 10 10 std::fill_n (myvector.begin(),4,20); // myvector: 20 20 20 20 10 10 10 10 std::fill_n (myvector.begin()+3,3,33); // myvector: 20 20 20 33 33 33 10 10 copy (std::begin(myvector), std::end(myvector), std::ostream_iterator<int>(cout, " "));// output
- std::iota
- 该函数来自于头文件numeric中,该函数可以使用连续递增值初始化一个数组容器。等价于:
-
template <class ForwardIterator, class T> void fill (ForwardIterator first, ForwardIterator last, const T& val) { while (first != last) { *first = val; ++val; ++first; } }
- 参数说明
first,last:表示要赋值的范围,不会对last指向的位置赋值。
val:起始第一个元素的赋值.- 示例
-
int my_array[9]; std::iota (std::begin(my_array), std::end(my_array), 10); std::iota (my_array, my_array+9, 10); copy (std::begin(my_array), std::end(my_array), std::ostream_iterator<int> (cout, " "));
- 总结
- generate 和generate_n 对指定范围内的元素赋值,赋值采用gen函数的返回值,需要根据设计gen函数。
- fill 和 fill_n 用以对指定范围内的元素赋予固定值。
- iota用以对指定范围内元素赋予从指定元素起的序列值,该序列值赋值完后会自增。