2015-02-11 88 views
0

据我了解,std :: vector在每次元素增长或收缩时分配/取消分配它所需的所有内存,因此指针运算可用于迭代向量元素。std :: list实现&指针arithemetic。

另一方面,std :: list使用双链表,每个元素指向下一个和上一个元素。

假设(可能错误地)std :: list动态地分配它的内存,所以内存被分配,如果需要时,增量。 std :: list如何仍然能够提供指针算术作为迭代它元素的手段?

+2

'std :: list'不提供迭代的指针算法。 – juanchopanza 2015-02-11 19:59:19

+1

你能提供一个你认为'std :: list'允许的例子吗? – SirGuy 2015-02-11 19:59:43

+0

begin()返回一个iter,所以我假设我可以使用像iter ++这样的运算符http://en.cppreference.com/w/cpp/container/list – tuk 2015-02-11 20:02:01

回答

3

粗略地说,您可以假设std::list::iterator是指向列表元素struct iterator { list::element *current };的指针的容器。而一个元素有指向下一个和上一个的指针,如struct element { list::element *next, *previous };当你递增该迭代器时,它只是重新指定这个指针指向下一个元素。像链接列表中的it->current = it->current->next一样。没有涉及指针算术。

+0

@tuk它不是一个指针。假设它有什么意义呢? – juanchopanza 2015-02-11 20:26:48

+0

我试图实现我自己的std :: list版本来执行你所描述的操作,但是当我尝试使用iter ++递增迭代器时,它忽略了我的特殊列表操作符++函数,而是试图使用指针运算....因为迭代器是一个指针。我可以使它工作的唯一方法是增加列表对象本身,以便调用我的operator ++函数。 – tuk 2015-02-11 20:28:50

+1

迭代器不是一个指针。 在我的例子中,迭代器是一个结构,你必须按照描述重写'operator ++'。运算符被重新定义为_iterator_,而不是列表或列表元素。 – ftynse 2015-02-11 20:33:56