gpt4 book ai didi

c++ - 使用模板生成静态查找表

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:16:58 26 4
gpt4 key购买 nike

我有:

const char kLetters[] = "QWERTYUIOPASDFGHJKLZXCVBNM";

我可以调用 kLetters[n] 在 O(1) 时间内获取键盘字母表的第 n 个字母。但是,我将不得不迭代 kLetter(花费 O(n) 或至少 O(log n) )时间进行反向查找。

我想使用模板创建一个反向查找表作为编译时静态查找表,想知道是否有办法做到这一点。

编辑 - 如评论中所述,反向查找意味着我提供“E”并返回 2。此外,我的字母示例不是最好的示例,我不想对顺序做出任何假设。出于这个原因,我将字母表更改为键盘顺序。

最佳答案

这样的事情怎么样?它允许您指定范围而不是完整的字符串。

#include <iostream>

template <int Start, int End, int N>
struct lookup {
static_assert(Start != End, "Can't have 0 length lookup table");
enum { value = lookup<Start+(Start < End ? 1:-1),End,N-1>::value };
};

template <int Start, int End>
struct lookup<Start,End,0> {
enum { value = Start };
};

template <int Start, int End, int V, int P=0>
struct reverse_lookup {
static_assert(Start != End, "V isn't in the range Start, End");
static_assert(Start != End || !P, "Can't have 0 length range");
enum { value = reverse_lookup<Start+(Start < End ? 1:-1),End,V,P+1>::value };
};

template <int Start, int End, int P>
struct reverse_lookup<Start,End,Start,P> {
enum { value = P };
};

int main() {
std::cout << char(lookup<'A', 'Z', 3>::value) << std::endl;
std::cout << char(lookup<'Z', 'A', 3>::value) << std::endl;
std::cout << int(reverse_lookup<'A','Z','F'>::value) << std::endl;
}

关于c++ - 使用模板生成静态查找表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7419129/

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