迭代器究竟是如何工作的? (多项选择)

时间:2013-02-28 02:00:45

标签: c++ linked-list

我很困惑为什么在这个多项选择题中最终答案(选择e。)是错误的:

Which of the following statements is the most accurate regarding linked lists?

a. Linked-lists take up more space than STL vectors because they allocate extra storage 
space for future growth.
b. The asymptotic complexity of inserting at the end of a doubly-linked list container 
storing only the pointer to the first element is O(1).
c. A loop in a singly-linked-list can be found in O(log(n)) time and O(n) memory overhead
d. A loop in a singly-linked-list can be found in O(n) time and O(1) memory overhead.
e. The number of elements in a linked-list is end_ptr -start_ptr + 1, where start_ptr points
to the first element in the linked list and end_ptr points to the last item of the linked-list.

也就是说,为什么不两者 d。和e。正确?在什么情况下,迭代器会返回end_ptr-start_ptr+1的大小,在什么情况下不会?选择是否应该说明end_ptr-start_ptr

2 个答案:

答案 0 :(得分:4)

链接列表不保证是连续的(实际上,从不 - 至少不是在真实场景中)。

这意味着减去它们的迭代器不能是一个恒定的时间操作(嗯,它可能是,但并非没有做出不合需要的权衡)。

通常,除非是恒定时间操作,否则不在迭代器上定义减号和加号运算符。


此外,即使您可以减去它们,迭代器也会指向一个经过最后一个元素,而不是最后一个元素。这意味着length = end - begin。没有必要加一个。

例如,使用std::vector

size_t len = v.end() - v.begin();

(虽然您通常只使用v.size()。)

答案 1 :(得分:1)

与矢量不同,列表中的项目不会存储在连续的位置。所以链接的list.end()应为null以标记列表的结尾。这就是为什么你不能通过算术得到列表大小。此外,结尾指向无效项目,一个项目超过最后一个有效元素。