C++ Boost::多索引vs字符串索引Boost::无序映射
我需要一个包含唯一元素的容器,用三元组int访问,每个int可以超过1.000.000.000 (实际填充的元素很少,实际上这些元素本身就是boost::无序的_映射)C++ Boost::多索引vs字符串索引Boost::无序映射,c++,boost,multidimensional-array,boost-multi-index,C++,Boost,Multidimensional Array,Boost Multi Index,我需要一个包含唯一元素的容器,用三元组int访问,每个int可以超过1.000.000.000 (实际填充的元素很少,实际上这些元素本身就是boost::无序的_映射) 使用像boost::multiindex这样的多索引数组(或者其他我不知道的东西)或者只使用组合字符串作为键的boost::unordered_映射更快吗?多索引不是您想要的,您似乎想要一个类型为三元组的单索引。(除非你真的想要三个独立的索引;如果我误解了,请留下评论。) 不要使用字符串,不。只需使用三元组作为键: typede
使用像boost::multiindex这样的多索引数组(或者其他我不知道的东西)或者只使用组合字符串作为键的boost::unordered_映射更快吗?多索引不是您想要的,您似乎想要一个类型为三元组的单索引。(除非你真的想要三个独立的索引;如果我误解了,请留下评论。) 不要使用字符串,不。只需使用三元组作为键:
typedef std::tuple<int, int, int> key_type;
typedef std::元组键类型;
如果您使用std::map
,您将获得对数查找,这可能就足够了,而且我认为您甚至不必再做任何工作(不确定是否默认为元组定义了词典比较)
如果要使用
std::unordered_map
(或boost版本),必须定义一个哈希函数。我想Boost已经有了一个元组,但C++11没有;但是基于hash\u combine()
实现自己很容易,您可以从Boost代码中裁剪出来。我确实认为std::tuple
有一个字典operator@Matthieu:干杯,很高兴知道。St0rM:如果你没有元组,(如果你没有元组,也可以查看
或
),然后你可以自己编一个,或者使用对
…事实上,看起来boost::tuple更好,即使现在我不得不绞尽脑汁去发现它是如何工作的。ThanksIt就像一对,只是有更多的元素,访问元素使用一些模板语法。boost元组的优点是,您应该能够直接在无序映射中使用它。事实上,它需要为您的元组定义一个哈希函数,这有点棘手,因为您必须记住元组在boost::tuples下,而不是在boost下。所以它是这样的:namespace boost{namespace tuples{std::size_t hash_value(key_type const&e){std::size_t seed=0;boost::hash_combine(seed,e.get());boost::hash_combine(seed,e.get());boost::hash_combine(seed,e.get());return seed;}
…但它还是很简单:-)