确定元素是否包含在多图中的最快方法?

时间:2014-01-27 09:39:54

标签: c++ multimap

假设一个多图< string,string>。我想测试是否包含一个元素,比如pair< string,string>(“foo”,“bar”)。当然,我可以使用像

这样的东西
auto range(myMap.equal_range("foo"));
auto it = find(range.first, range.second, pair<string, string>("foo", "bar"));

但这意味着在范围内进行线性搜索。由于应该对多图表进行排序,我宁愿从订单和搜索中获得对数复杂度。这可能吗?

4 个答案:

答案 0 :(得分:2)

如果这是典型的访问模式,我会说multimap是错误的容器?

以下情况可能更合适?

std::map<std::string, std::set<std::string>>

好的,插入和删除更复杂,但查找符合您的要求。

答案 1 :(得分:0)

您只想使用find()

 multimap<T> m;
 T t;
 // ...
 multimap<T>::iterator r = m.find(t);
 if (r != m.end()) {
     // hit
 }

答案 2 :(得分:0)

C ++ 98中具有等效键的元素的相对顺序无法保证,因此根据您的构建环境,您会看到搜索范围的线性复杂性。

您可以通过创建映射到multimap的{​​{1}}来使用自定义map

set

如果您期望许多值具有相同的键,这可能很有用。否则,您的原始解决方案看起来更好,因为迭代不是那么干净。应编写一个搜索此容器的函数。

答案 3 :(得分:-1)

Multimaps通常实现为红黑树(GNU C ++就是这样)。因此,通过迭代器对它们进行搜索将是O(log n)。