扫描二维码
随时随地手机看文章
clear()
成员函数视为常量时间复杂度O(1)的。但是其实不然。我感觉可能是很多人都知道对于vector
而言,clear()
之后,修改了size()
的结果,不影响capacity()
的结果,因而得出clear()
只是修改了某个标记,是常量时间复杂度的错误结论。其实C 标准明确指出不管是序列容器(比如vector
)还是关联容器(比如unordered_map
)其clear()
成员函数都是线性时间复杂度O(n)的。因为只要执行了clear()
就需要对其存储的元素调用析构函数,这个析构操作显然是逐个析构的。因而时间复杂度是O(n)。当然在实践中,也有个例。比如当vector
存储基本数据类型或POD类型(比如基本数据类型构成的struct)的时候,由于其元素类型没有析构函数(也不需要析构函数),加之vector
内部连续存储的特性,编译器的实现是可以在常量时间完成clear()
的。Linear in size(destructions). This may be optimized to constant complexity for trivially-destructible types(such as scalar or PODs), where elements need not be destroyed http://www.cplusplus.com/reference/vector/vector/clear当然仅限于
vector
存储基本数据类型和POD类型的时候,编译器可能有此优化。如果vector
存储的是其他类型的对象,或者是其他容器(比如list
、map
、unordered_map
)都是没办法做这个优化的!所以在工程实践中,我们要思考是否每次都需要及时的clear掉一个容器。比如在后台服务中,有些容器类型的变量在命中某些条件下要进行clear()
,后续逻辑中判断容器是空的,就不在用之进行某些逻辑(比如遍历它,进行某种操作)。其实也可以用一个bool标记来存储后续是否需要遍历该容器,待到本次请求的响应返回给client之后,再来清理这个容器也不迟。当然这种操作在容器的元素个数不多的时候是完全没有必要的,会丧失一些可读性。不过这种思考还是需要有的。如果元素过多的时候,或许可能是性能优化的一个小点。auto
标普500指数今年迄今为止下跌22.7%,但高盛(Goldman Sachs)策略师认为估值依然太高。摩根士丹利旗下的Morgan Stanley Wealth Management称,面对高通胀环境下的利率大幅上升,股...
关键字: DMA MANAGEMENT 高通 ST