在C ++ 11中,我使用std::next
是因为如果要将vector
更改为list
,则不必更改其余代码。
对于list
,std::next
为O(n),因为我需要迭代所有元素。但是vector
怎么样?我发现了this note on cppreference:
但是,如果
InputIt
或ForwardIt
另外满足LegacyRandomAccessIterator的要求,则复杂度是恒定的。
vector
是否满足这些要求?为什么选择“旧版”?
答案 0 :(得分:17)
有一个计划在C ++ 20中添加概念(编译时间类型约束)。新标准应该包含InputIterator
或RandomAccessIterator
之类的概念。为了区分概念和类似旧特征的需求,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 ++库功能(已取代了当前方法),现有的迭代器已重命名为“旧版”。范围将具有新的迭代器。现有的将仍然存在,因此被称为“旧版”。