【发布时间】:2015-05-18 01:17:51
【问题描述】:
给定任何字符,我确定该字符是否属于一组已知字符(而不是容器类型)的最快方法是什么。
换句话说,实现条件的最快优雅方式是什么:char c = 'a';if(c == ch1 || c == ch2 || c == ch3 ...) // Do something...
是否有一个 STL 容器(我认为它可能是 unordered_set?),我可以将字符作为键传递给它,如果键存在,它将返回 true?
任何具有 O(1) 查找时间的东西都适合我。
【问题讨论】:
-
将
ch1ch2和ch3放入std::unordered_set<char>然后测试c 是否在其中。现在是 o(1) 时间查找。 O(m) 内存,m = 集合中的字符数。剩下的只是(丑陋和愚蠢的)过早优化。这就是 std::set 的用途。 -
要小心,因为这些花哨的数据结构可能会导致动态内存分配最终比常规 if 语句慢。
-
您可以尝试在函数中将它们设为全局变量(例如
static const)以节省构建成本。 -
@FélixCantournet - 具有讽刺意味的是,正如下面的测试所示,
std::set是解决问题的最糟糕的解决方案。 -
@ddriver
std::unordered_set运行速度慢 4 倍,打字速度快 10 倍。阅读简单 10 倍。但最重要的是,我引用了 OP:“任何具有 O(1) 查找时间的东西都对我有用”。说得够多了。
标签: c++ c++11 stl containers unordered-set