使用哪种STL结构?

时间:2013-04-07 00:57:17

标签: c++ stl containers

我需要一个解决方案,它将存储一个非唯一的键 - 值对。我不想重复键(空间效率),我想专注于查找速度(插入新数据的效率不太重要)。我将在这里使用std :: multimap。但我必须查找符合某些范围标准的密钥。

最复杂的例子: 键是一个字符串,值不重要。 我想找出所有的值,哪些键以“Lol”开头。 或者我想找出所有值,哪些键“介于”“bar”和“foo”之间。

我可以使用multimap吗?我的第二个想法是使用有序向量,它将指向值的向量。这样的事情:

std::vector<std::string, std::vector<T>> sorted_vec;

然后我可以轻松满足搜索条件。但我真的很关心查找的性能。这是一种正确的方法吗?

3 个答案:

答案 0 :(得分:2)

是的,您可以使用std :: multimap。 要完成范围基础查询,可以在头文件算法中使用两个算法std :: lower_bound和std :: upper_bound。

答案 1 :(得分:1)

  

或者我想找出所有值,哪些键“介于”“bar”和“foo”之间。

如果您有Boost,我建议使用boost::flat_map(它只是标题库) - 它维护sorted vector inside。通常,由于更好的紧凑性/局部性,它比 std :: map 具有更好的查找效果。

否则使用

vector<pair<string,value>>
or
vector<pair<string,vector<value>>> //(for re-use of keys)
// instead of pair, you may use just struct if you concerned with lexicographical compare

std::sort

加上标准:: equal_range / lower_bound

答案 2 :(得分:0)

您应该使用Patricia trie

one in libstdc++,虽然它是非标准的。

如果您要坚持使用标准容器,我认为您的分类矢量解决方案是最好的。