说我有deque元素索引"我"。 Deque允许在恒定时间内通过索引访问元素。所以看起来我们可以在内存中快速找到元素位置。但是当涉及到获取迭代器(例如传递给erase())时,我们需要使begin()+ i占用线性时间。是否可以转换索引 - >迭代器在恒定时间内?如果不是索引/创建迭代器之间的区别是什么?是否可能进行相反的操作:指向元素/迭代器的指针 - > index(没有迭代到开头/结尾)?
答案 0 :(得分:2)
是否可以转换索引 - >迭代器在恒定时间内?
是。
iter = deq.begin() + index;
这是不变的时间,与你的信念相反。标准库中的任何迭代器(或由与标准库相同的哲学设计)支持operator+
,在恒定时间内完成。实际上,所有作用于标准库迭代器的运算符都是恒定的时间。没有实现任何不能在恒定时间内实现的运算符。这就是为什么只有随机访问迭代器(vector
,deque
,string
等...)支持添加整数或相减的操作。
是否可以进行相反的操作:指向元素/迭代器的指针 - >索引
是
index = iter - deq.begin();
这也是不变的时间。
答案 1 :(得分:1)
我们需要创建begin()+ i,这需要线性时间。
不,不会。
支持operator+
的迭代器应该在恒定时间内执行它(对于标准迭代器来说这是正确的,用户定义的迭代器可以定义线性的operator+
,但这将是非常规的)。
在常规时间内不支持它的迭代器需要使用std::advance
而非operator+
std::deque::iterator
是一个随机访问迭代器,因此begin() + i
有效且需要恒定时间。