std::find
和std::map.find
都是O(logN)吗?
如果是,std::find
如何在对数时间内对std::map
进行搜索?
std::find
的实施是否专门用于std::map
用例?
答案 0 :(得分:8)
不,std::find
是O(N),无论容器如何。它不知道“容器”,std::map
没有专门化。 std::find
仅使用迭代器,它没有关于底层容器的信息。根据{{3}},实现等同于:
template<class InputIt, class T>
InputIt find(InputIt first, InputIt last, const T& value)
{
for (; first != last; ++first) {
if (*first == value) {
return first;
}
}
return last;
}
根据C ++标准(强调我的):
25.2.5查找[alg.find]
template<class InputIterator, class T>
InputIterator find(InputIterator first, InputIterator last,
const T& value);
...
返回:i
范围内的第一个迭代器[first,last)
,其中包含以下相应条件:*i == value
,. 。 。 。如果没有找到这样的迭代器,则返回last
。
复杂性:最多 - 相应谓词的最后一次应用。