在编译时间创建查找表
Creating a lookup table at compile time
c noob此处。给定constexpr f
?
{f(0), f(1), ..., f(1023)}
的最简单方法是什么您可以立即使用lambda:
#include <array>
using ResultT = int;
constexpr ResultT f(int i)
{
return i * 2;
}
constexpr auto LUT = []
{
constexpr auto LUT_Size = 1024;
std::array<ResultT, LUT_Size> arr = {};
for (int i = 0; i < LUT_Size; ++i)
{
arr[i] = f(i);
}
return arr;
}();
static_assert(LUT[100] == 200);
deviationn的解决方案需要C 17(对于constexpr lambda(。
作为一种补充,这里是一种与C 14
一起使用的解决方案#include <array>
constexpr int f(int i) { return 2 * i; }
template <std::size_t... I>
constexpr auto lookup_helper(std::index_sequence<I...>)
{
return std::array<int, sizeof...(I)>({f(I)...});
}
template <size_t N>
constexpr auto lookup()
{
return lookup_helper(std::make_index_sequence<N>());
}
int main()
{
constexpr int N = 10;
constexpr auto a = lookup<N>();
// Check it works
static_assert(a[N-1]==2*(N-1));
}
这个想法是使用std::index_sequence<I...>
。但是,如果您可以使用C 17 deviationn的解决方案更方便。
lambda解决方案对于一次性而言是可以的。如果您必须制作几个,则可以使用类似的constexpr函数模板概括它:
#include <algorithm>
#include <array>
#include <cstdint>
template <typename T, std::size_t N, typename Generator>
constexpr std::array<T, N> make_array(Generator fn) {
std::array<T, N> table = {};
for (std::size_t i = 0; i != N; ++i) {
table[i] = fn(i);
}
return table;
}
然后,您可以使用它来创建编译时查找表:
constexpr float doubler(std::size_t i) { return 2.0f * i; }
constexpr auto lookup_table = make_array<float, 5>(doubler);
static_assert(lookup_table[3] == 6.0f);
相关文章:
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 尝试创建一个程序来查找非二叉树的高度.最终得到一个很长的循环,没有答案
- 创建程序以从给定的.txt文件中查找文本,替换并计算单词
- 如何创建一个函数,该函数在文本中查找单词的匹配项,包括跳过
- 如何在给定任意数量的整数的情况下创建一个唯一键?并使用该键存储,然后从地图中查找
- 创建一个函数以查找数组中的重复项,而无需对C++进行排序
- 在编译时间创建查找表
- 尝试在自定义 QT 创建器文本编辑器中创建查找和替换循环.我似乎无法设置光标位置
- 创建和管理查找容器的正确方法
- 如何创建一个以键为输入并在C++std:map中查找值的模板函数
- 查找窗口( ... ) 未"查找"创建的消息窗口
- 在 C 中创建一种查找表
- 通过智能指针查找谁创建了对象
- 试图创建一个函数来查找用户输入数字的斐波那契数
- C++如何创建和使用指针来查找字符数组的长度
- 在动态创建的 varchar 数组C++中查找值
- C++点坐标创建图形并查找 MST
- 找到LFSR多项式并在C++中创建查找表
- 使用QFileInfo查找创建日期和时间