概述

STL容器的clear的时间复杂度不是O(1)

可能很多人都不在意,在使用STL容器的时候,潜意识里面将clear()成员函数视为常量时间复杂度O(1)的。但是其实不然。我感觉可能是很多人都知道对于vector而言,clear()之后,修改了size()的结果,不影响capacity()的结果,因而得出clear()只是修改了某个标记,是常量时间复杂度的错误结论。

其实C++标准明确指出不管是序列容器(比如vector)还是关联容器(比如unordered_map)其clear()成员函数都是线性时间复杂度O(n)的。因为只要执行了clear()就需要对其存储的元素调用析构函数,这个析构操作显然是逐个析构的。因而时间复杂度是O(n)。

auto替代手写类型

比如在基于范围的循环中尽量使用auto&,否则容易踩坑。这个观点在Scott Meryer的《Effictive Modern C++》一书的条款5中已经讲得很清楚了。

下面简要概述一下,对于unordered_map而言,其中的元素类型是:

1
std::pair<const std::string, int>