C++ 中的 std::generate
是 C++11 引入的一个算法,用于为指定范围内的每个元素生成一个新值,并将这些值赋给该范围内的元素。它通常与生成器(如 lambda 表达式、函数对象或函数指针)一起使用,以按照某种规则生成一系列值。
std::generate
的函数签名如下:
template< class ForwardIt, class Generator >
void generate( ForwardIt first, ForwardIt last, Generator g );
first
和last
定义了要填充值的范围[first, last)
。g
是一个生成器对象,它必须支持函数调用操作,并且每次调用时应返回一个新值。
下面是一个详细的代码示例,演示如何使用 std::generate
来填充一个 std::vector
容器:
#include <iostream>
#include <vector>
#include <algorithm> // std::generate
#include <random> // std::default_random_engine, std::uniform_int_distribution
int main() {
// 创建一个包含 10 个元素的 vector,初始值为 0
std::vector<int> vec(10, 0);
// 创建一个随机数生成器,生成范围在 [1, 100] 之间的整数
std::random_device rd; // 用于获得随机种子
std::default_random_engine eng(rd());
std::uniform_int_distribution<int> distr(1, 100);
// 使用 std::generate 来填充 vector
std::generate(vec.begin(), vec.end(), :ml-search[&] {
return distr(eng);
});
// 输出生成的随机数
for (const auto& num : vec) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
在这个示例中:
- 我们创建了一个包含 10 个元素的
std::vector<int>
,初始值全部为 0。 - 使用
std::random_device
和std::default_random_engine
创建了一个随机数生成器eng
,以及一个生成范围在 [1, 100] 之间的整数分布distr
。 - 使用
std::generate
填充vec
,其中生成器是一个 lambda 表达式:ml-search[&] { return distr(eng); }
,每次调用该 lambda 表达式都会生成一个新的随机数。 - 最后,我们遍历
vec
并输出生成的随机数。
std::generate
是一种非常灵活和高效的填充容器的方法,特别适用于需要根据某种复杂逻辑生成一系列值的场景。