📅  最后修改于: 2023-12-03 14:59:45.480000             🧑  作者: Mango
在C++ STL中,algorithm.generate()是一个非常强大的函数,它可以帮助程序员在给定的范围内生成值,从而填充容器。这个函数是通过将一个生成器函数应用于每个范围内的元素,将一个容器填充了特定数量的值。
首先,让我们看一下algorithm.generate()的基本语法:
generate(ForwardIt first, ForwardIt last, GeneratorFn gen);
这个函数接受三个参数:
first
和last
是要填充的容器中的迭代器,其中first
指向要从中开始填充值的第一个元素,last
指向终止位置的下一个元素;GeneratorFn
是一个可调用对象,它接受一个参数并返回一个值,用于生成每个元素的值。接下来,让我们看一个简单的例子来帮助你更好地理解该函数是如何工作的。
#include <iostream>
#include <algorithm>
#include <vector>
int main() {
std::vector<int> vec(10);
std::generate(vec.begin(), vec.end(), [] { return rand() % 100; });
for (const auto& v : vec) {
std::cout << v << ' ';
}
std::cout << std::endl;
}
在这个简单的例子中,我们首先定义了一个名为vec
的vector并分配了10个整数的空间。然后我们调用了algorithm.generate()并传递了一个lambda函数作为生成器,该lambda函数将每个元素设置为一个随机数。
注意,我们在调用rand()函数时没有提供种子,这意味着我们将使用默认种子为1的伪随机数生成器。因此,这个程序将生成一个随机的10个数字的向量并将其打印在控制台上。
除了使用lambda表达式作为生成器函数之外,您还可以使用任何其他可调用对象,例如函数对象或普通函数。
接下来,让我们看一下一些algorithm.generate()的其他用例。
除了使用生成器函数来生成随机数之外,algorithm.generate()还可以用于生成递增序列。在这种情况下,你可以编写一个简单的函数,用于按照特定规则生成一个序列。
让我们看一个简单的例子,其中我们将使用一个名为increment()
的函数来生成一个递增的序列。
#include <iostream>
#include <algorithm>
#include <vector>
int increment(int& i) { return i++; }
int main() {
std::vector<int> vec(10);
int n = 0;
std::generate(vec.begin(), vec.end(), [&n] { return increment(n); });
for (const auto& v : vec) {
std::cout << v << ' ';
}
std::cout << std::endl;
}
在这个例子中,我们首先定义了一个名为increment()
的函数,它接受一个引用并返回一个递增的值。然后我们定义了一个名为vec
的vector并通过调用std::vector<int> vec(10);
来分配10个整数的空间。
接下来,我们定义了一个名为n
的变量并将其初始化为0。然后我们调用了algorithm.generate()
并使用increment()
函数作为生成器函数。该函数返回n的当前值并将其递增。
最后,我们迭代vector并将其打印在控制台上。在这个例子中,输出应该是从0到9的整数。
最后,让我们看一下如何使用algorithm.generate()来生成重复的值。在这种情况下,我们可以简单地返回一个静态值作为生成器函数。例如,以下代码将使用algorithm.generate()生成一个vector并将其所有元素设置为10。
#include <iostream>
#include <algorithm>
#include <vector>
int main() {
std::vector<int> vec(10);
std::generate(vec.begin(), vec.end(), [] { return 10; });
for (const auto& v : vec) {
std::cout << v << ' ';
}
std::cout << std::endl;
}
在这个例子中,我们定义了一个名为vec
的vector,并将其所有元素构造为10。然后,我们迭代vector并将其打印在控制台上。在这个例子中,输出应该是一行10个整数,都为10。