向量O(n)或O(1)是std :: next吗?

时间:2019-04-09 07:01:24

标签: c++

在C ++ 11中,我使用std::next是因为如果要将vector更改为list,则不必更改其余代码。

对于liststd::next为O(n),因为我需要迭代所有元素。但是vector怎么样?我发现了this note on cppreference

  

但是,如果InputItForwardIt另外满足LegacyRandomAccessIterator的要求,则复杂度是恒定的。

vector是否满足这些要求?为什么选择“旧版”?

2 个答案:

答案 0 :(得分:17)

有一个计划在C ++ 20中添加概念(编译时间类型约束)。新标准应该包含InputIteratorRandomAccessIterator之类的概念。为了区分概念和类似旧特征的需求,cppreference将LegacyRandomAccessIterator等用于概念前需求,将RandomAccessIterator等用于概念需求。

因此,是的,std::vector::iterator符合LegacyRandomAccessIterator的要求,实际上也将实现RandomAccessIterator的概念。这直接得出结论,std::next上调用的vector::iterator具有复杂度O(1)。

答案 1 :(得分:9)

  

向量满足这些要求吗?

是的,它确实:

https://en.cppreference.com/w/cpp/container/vector

报价:“迭代器LegacyRandomAccessIterator”

  

为什么要使用“旧版”?

由于即将推出的名为ranges的C ++库功能(已取代了当前方法),现有的迭代器已重命名为“旧版”。范围将具有新的迭代器。现有的将仍然存在,因此被称为“旧版”。