gpt4 book ai didi

c++ - 通过 STL 或 Boost 引入虚拟参数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:32:07 25 4
gpt4 key购买 nike

假设有人想用随机数填充一个 vector 。则有如下明显的解决方案:

vector<int> result;
result.resize(n);
for (int i = 0; i < n; ++i) {
result[i] = generateRandomNumber();
}

好的,它显然有效,但我想了解摆脱 for 循环的最简单的 STL/Boost 方法是什么。使用 std::transform 很诱人,但它需要一个带有一个参数的函数。有什么好的 STL 方法可以在函数中引入伪参数吗?

最佳答案

C++标准库有std::generate()std::generate_n();

例如:

#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <iterator>
int generateRandomNumber()
{
return std::rand();
}
int main()
{
int n = 10;
std::vector<int> result;
generate_n(back_inserter(result), n, generateRandomNumber);
copy(result.begin(), result.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << '\n';
}

测试:https://ideone.com/5xD6P

至于第二个问题,如果我理解正确的话,是如何创建一个接受 int 参数、忽略它并调用你的 int f() 的仿函数?

C++98 的方法是实际编写整个仿函数:

struct IgnoreArgument
{
typedef int(*fp_t)();
fp_t fp;
IgnoreArgument(fp_t f) : fp(f) {}
int operator()(int) const { return fp(); }
};
...
transform(v.begin(), v.end(), v.begin(), IgnoreArgument(f));

测试:https://ideone.com/DTsyl

C++11 的方式是使用 lambda 表达式

transform(v.begin(), v.end(), v.begin(), [](int){return f();});

测试:https://ideone.com/nAPXI

而C++98/boost方式是使用boost::bind

transform(v.begin(), v.end(), v.begin(), boost::bind(f));

测试:https://ideone.com/cvd88

关于c++ - 通过 STL 或 Boost 引入虚拟参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5873901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com