作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想要的功能是这样的:
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/
我是一名优秀的程序员,十分优秀!