C ++ 11 / STL / Boost中是否有任何数据结构代表具有通用索引类型的数组,或者我必须自己实现这样的类型?
即。我想做这样的事情:
std::set<std::string>> to_lookup, to_lookup2;
int i = 10, j = 13;
// initialization of to_lookup
// count is of the container type/data structure I am looking for
count[to_lookup] = i;
count[to_lookup2] = j;
我知道STL中的std::map
和std::unordered_map
容器,但这些容器与我的要求不符。对我来说,插入和查找可以在O(1)中完成。
答案 0 :(得分:2)
如果您使用std::unordered_map
已基本上几乎不可能变得更快,因为根据元素数量总会有一些开销(因此您无法获得完美的 O(1)(除非您能够将所有可能的键引用为数组中的索引)。)
但是,如果您仍然认为std::unordered_map
仅因为大量条目而过慢,请尝试添加另一个图层来减少地图中元素的数量。
在您的示例中,使用std::string
作为键(?),您可以使用第一个字符(未经测试但应该有效):
std::vector<std::unordered_map<const std::string, myWhateverType> > container(256);
// To access an element, this just adds one more layer:
container[key[0]][key] = value;
迭代所有元素变得有点复杂了。但是,这实际上会将std::unordered_map
中的元素数量减少到1/255(当然,取决于键值的实际分布;如果所有键都以key
之类的内容开头,那么您就赢了“获得除小开销之外的其他任何东西。
它会提高性能吗?这实际上取决于条目数和密钥。