Deque索引 - 迭代器转换

时间:2015-03-07 18:40:13

标签: c++ iterator deque

说我有deque元素索引"我"。 Deque允许在恒定时间内通过索引访问元素。所以看起来我们可以在内存中快速找到元素位置。但是当涉及到获取迭代器(例如传递给erase())时,我们需要使begin()+ i占用线性时间。是否可以转换索引 - >迭代器在恒定时间内?如果不是索引/创建迭代器之间的区别是什么?是否可能进行相反的操作:指向元素/迭代器的指针 - > index(没有迭代到开头/结尾)?

2 个答案:

答案 0 :(得分:2)

  

是否可以转换索引 - >迭代器在恒定时间内?

是。

iter = deq.begin() + index;

这是不变的时间,与你的信念相反。标准库中的任何迭代器(或由与标准库相同的哲学设计)支持operator+,在恒定时间内完成。实际上,所有作用于标准库迭代器的运算符都是恒定的时间。没有实现任何不能在恒定时间内实现的运算符。这就是为什么只有随机访问迭代器(vectordequestring等...)支持添加整数或相减的操作。

  

是否可以进行相反的操作:指向元素/迭代器的指针 - >索引

index = iter - deq.begin();

这也是不变的时间。

答案 1 :(得分:1)

  

我们需要创建begin()+ i,这需要线性时间。

不,不会。

支持operator+的迭代器应该在恒定时间内执行它(对于标准迭代器来说这是正确的,用户定义的迭代器可以定义线性的operator+,但这将是非常规的)。

在常规时间内不支持它的迭代器需要使用std::advance而非operator+

进行推进

std::deque::iterator是一个随机访问迭代器,因此begin() + i有效且需要恒定时间。