【C++】C++中的std::generate函数详解

目录

一.函数介绍

1.函数原型

2.使用示例

3.其他使用场景

4.注意事项

5.性能

二.std::generate 函数在性能上优势和瓶颈

1.性能优势

2.潜在瓶颈

3.示例代码


一.函数介绍

在C++中,std::generate 是一个标准库算法,定义在 <numeric> 头文件中。

作用:它用于生成一个值的序列,并将其赋值给一个迭代器范围内的元素。

这个算法特别有用,当你需要初始化一个容器或一个数组的元素时,而这些元素的值可以通过某种计算或函数生成。

1.函数原型

std::generate 有以下函数原型:

template<class ForwardIterator, class Generator> void generate(ForwardIterator first, ForwardIterator last, Generator g);
  • ForwardIterator: 一个前向迭代器类型,可以是指向容器元素的迭代器,如 std::vectorstd::list 等。
  • Generator: 一个生成器类型,可以是一个函数、函数对象或 lambda 表达式,用于生成值。
  • first: 范围的起始迭代器。
  • last: 范围的结束迭代器(不包括在内)。
  • g: 生成器函数或对象。

2.使用示例

以下是一些使用 std::generate

### C++ 中 `std::generate` 函数的用法 `std::generate` 是 C++ 标准库中的一个算法,用于填充容器的内容。该函数接受两个迭代器范围以及一个生成器函数或可调用对象作为参数,并依次对该范围内每个元素赋值。 语法如下: ```cpp #include <algorithm> #include <vector> namespace { template<typename ForwardIt, typename Generator> void generate(ForwardIt first, ForwardIt last, Generator g); } ``` 此函数会反复调用给定的生成器 `g()` 并将返回的结果存储到 `[first, last)` 范围内的每一个位置上[^1]。 下面是一个简单的例子来展示如何使用 `std::generate` 来初始化向量中的元素: ```cpp #include <iostream> #include <vector> #include <algorithm> // For std::generate #include <functional> // For std::ref // A simple generator function that increments an internal counter each time it's called. class CounterGenerator { private: int value; public: explicit CounterGenerator(int startValue = 0) : value(startValue) {} int operator() () { return ++value; } }; void demonstrateGenerateWithFunctionObject() { std::vector<int> numbers(5); CounterGenerator gen; std::generate(numbers.begin(), numbers.end(), gen); for (auto num : numbers) { std::cout << num << ' '; } // Output should be something like: 1 2 3 4 5 } /// Using lambda expression as a generator with std::generate void demonstrateGenerateWithLambdaExpression() { std::vector<std::string> names{"Alice", "Bob"}; auto randomNamePicker = [&names]() -> std::string& { static thread_local std::mt19937 rng(std::random_device{}()); std::uniform_int_distribution<> dist(0, names.size()-1); return names[dist(rng)]; }; std::vector<std::reference_wrapper<const std::string>> selectedNames(3); std::generate(selectedNames.begin(), selectedNames.end(), std::cref(randomNamePicker())); for(auto&& nameRef : selectedNames){ std::cout<<nameRef.get()<<'\n'; } } ``` 上述代码展示了两种不同类型的生成器:一个是类成员函数重载了 `operator()` 的方式;另一个则是通过 Lambda 表达式实现随机选取字符串的功能。这两种方法都可以很好地配合 `std::generate` 使用[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员赵大宝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值