常量时间std :: list调整大小到给定的最后一个元素?

时间:2014-04-10 02:30:06

标签: c++ list

调整std::list的大小是线性时间,因为它需要先找到n元素。

但是有可能指向一个元素(使用迭代器)并通过声明指向的元素是新的最后一个元素来在常量时间调整大小吗?

它会是这样的: make_last(const_iterator pos)

2 个答案:

答案 0 :(得分:1)

不幸的是,在C ++ 11中,一般std::list拼接是O(n),以便进行O(1)大小检查。

否则您可能已将不受欢迎的项目移动到另一个列表。

但即使这只是一半的解决方案,因为必须在某些时候销毁这些物品。但是,如果保证恒定时间拼接,则会使临时调整大小O(1)。


实际的解决方案是使用例如std::vector代替std::list

由于必须销毁,它不会给你O(1)调整大小,除非调整大小在最后丢弃一定数量的项目,但它避免了所有这些复杂性。

由于决定让std::list::size成为一个恒定时间操作,我不知道任何剩余的理由使用std::list来做任何事情。

答案 1 :(得分:0)

在C ++ 03中,你在你不想要的第一个元素上使用erase - 如果优化器意识到元素不需要破坏,则为常数时间。

在C ++ 11中,你被填满了......正如Alf解释的那样,它必须按照新的尺寸进行计算。