gpt4 book ai didi

c++ - 使用枚举指定的函数填充 vector

转载 作者:行者123 更新时间:2023-11-27 23:01:44 24 4
gpt4 key购买 nike

我想要的功能是这样的:

std::vector<float> GetFuncVec(int N, FuncType type)
{
std::vector<float> fn(N);
float tmp = (N - 1) / 2.0;

switch (type) {
case SIN:
for (int i=0; i<N; ++i)
fn[i] = sin(M_PI * i / tmp);
break;
case SINC:
for (int i=0; i<N; ++i)
fn[i] = sin(M_PI * i / tmp) / (M_PI * i / tmp);
break;
...
}

return fn;
}

我觉得这不能令人满意,因为有很多代码重复。环顾四周,发现了STL算法std::generate()它可以使用仿函数填充一个 vector ,它可以有一个增量成员来扮演 i 的角色。

我看到两条潜在路线。第一种是使用工厂来初始化仿函数。这种方法的问题是代码分离(上面,不同的情况很好地保持在一起)和增加了需要多个新类的开销。

第二种是使用 lambda 函数(我对此经验很少)。这很好,因为我可以在 switch 语句的一行中定义每个函数。但我看不出如何避免范围界定问题(在 switch 语句的范围之外无法访问 lambda 函数)。

是否有使用 lambda 函数的解决方案?从效率的角度和可读性的角度来看,最佳选择是什么?

最佳答案

也许你想要这样的东西......? (看到它运行 here

#include <iostream>
#include <vector>
#include <cmath>
#include <functional>

enum Func { Sin, Sinc };

std::vector<float> f(int n, Func func)
{
std::vector<float> results(n);
float tmp = (n - 1) / 2.0;
int i;
std::function<float()> fns[] = {
[&] { return sin(M_PI * i / tmp); },
[&] { return sin(M_PI * i / tmp) / (M_PI * i / tmp); }
};
auto& fn = fns[func];
for (i=0; i<n; ++i)
results[i] = fn();

return results;
}

int main()
{
std::vector<float> x = f(10, Sin);
for (auto& v : x) std::cout << v << ' '; std::cout << '\n';

std::vector<float> y = f(10, Sinc);
for (auto& v : y) std::cout << v << ' '; std::cout << '\n';
}

输出:

0 0.642788 0.984808 0.866025 0.34202 -0.34202 -0.866025 -0.984808 -0.642788 -2.44929e-16 
-nan 0.920725 0.705317 0.413497 0.122477 -0.0979816 -0.206748 -0.201519 -0.115091 -3.89817e-17

关于c++ - 使用枚举指定的函数填充 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26883301/

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