双端队列索引迭代器转换
Deque index-iterator conversion
假设我有双端队列元素索引"i"。 Deque 允许在恒定时间内通过索引访问元素。所以看起来我们可以快速找到内存中的元素位置。但是当涉及到一个迭代器时(例如传递给 erase() ),我们需要制作 begin() + i ,这将花费线性时间。是否可以在恒定时间内转换索引 - >迭代器?如果不是,indexing/creating 和迭代器有什么区别?是否可能进行相反的操作:指向 element/iterator 的指针 -> 索引(不迭代到 begin/end)?
we need to make begin() + i which will take linear time.
不,不会的。
支持 operator+
的迭代器应该在常数时间内完成(这对标准迭代器来说是正确的,用户定义的迭代器可以定义 operator+
是线性的,但这将是非常规的)。
在恒定时间内不支持它的迭代器需要使用 std::advance
而不是 operator+
来推进
std::deque::iterator
是一个随机访问迭代器,所以 begin() + i
是有效的并且需要常数时间。
Is it possible to convert index -> iterator in constant time?
是的。
iter = deq.begin() + index;
这是常数时间,与你的看法相反。支持 operator+
的标准库中的任何迭代器(或按照与标准库相同的理念设计的)都在常数时间内执行。事实上,所有作用于标准库迭代器的运算符都是常数时间。任何无法在恒定时间内实现的运算符都不会实现。这就是为什么只有随机访问迭代器(vector
、deque
、string
等)支持整数加法或相互减法等操作。
Is the opposite operation possible: pointer to element/iterator -> index
是的。
index = iter - deq.begin();
这也是常数时间
假设我有双端队列元素索引"i"。 Deque 允许在恒定时间内通过索引访问元素。所以看起来我们可以快速找到内存中的元素位置。但是当涉及到一个迭代器时(例如传递给 erase() ),我们需要制作 begin() + i ,这将花费线性时间。是否可以在恒定时间内转换索引 - >迭代器?如果不是,indexing/creating 和迭代器有什么区别?是否可能进行相反的操作:指向 element/iterator 的指针 -> 索引(不迭代到 begin/end)?
we need to make begin() + i which will take linear time.
不,不会的。
支持 operator+
的迭代器应该在常数时间内完成(这对标准迭代器来说是正确的,用户定义的迭代器可以定义 operator+
是线性的,但这将是非常规的)。
在恒定时间内不支持它的迭代器需要使用 std::advance
而不是 operator+
std::deque::iterator
是一个随机访问迭代器,所以 begin() + i
是有效的并且需要常数时间。
Is it possible to convert index -> iterator in constant time?
是的。
iter = deq.begin() + index;
这是常数时间,与你的看法相反。支持 operator+
的标准库中的任何迭代器(或按照与标准库相同的理念设计的)都在常数时间内执行。事实上,所有作用于标准库迭代器的运算符都是常数时间。任何无法在恒定时间内实现的运算符都不会实现。这就是为什么只有随机访问迭代器(vector
、deque
、string
等)支持整数加法或相互减法等操作。
Is the opposite operation possible: pointer to element/iterator -> index
是的。
index = iter - deq.begin();
这也是常数时间