假设一个多图< 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"));
但这意味着在范围内进行线性搜索。由于应该对多图表进行排序,我宁愿从订单和搜索中获得对数复杂度。这可能吗?
答案 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)。