是std :: find和std :: map.find都是O(logN)?

时间:2015-05-28 03:03:22

标签: c++ stl

std::findstd::map.find都是O(logN)吗? 如果是,std::find如何在对数时间内对std::map进行搜索?

std::find的实施是否专门用于std::map用例?

1 个答案:

答案 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);
...
  1. 返回:i范围内的第一个迭代器[first,last),其中包含以下相应条件:*i == value ,. 。 。 。如果没有找到这样的迭代器,则返回last

  2. 复杂性:最多 - 相应谓词的最后一次应用。