具有通用索引类型的数组

时间:2014-04-29 06:29:31

标签: c++ c++11 boost stl

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::mapstd::unordered_map容器,但这些容器与我的要求不符。对我来说,插入和查找可以在O(1)中完成。

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之类的内容开头,那么您就赢了“获得除小开销之外的其他任何东西。

它会提高性能吗?这实际上取决于条目数和密钥。