【问题标题】:std::list implementation & pointer arithemetic.std::list 实现和指针运算。
【发布时间】:2015-02-11 19:58:32
【问题描述】:

据我了解,std::vector 会在每次元素增长或缩小时分配/取消分配所需的所有内存,因此可以使用指针算法来迭代向量元素。

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

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

【问题讨论】:

  • std::list 不提供迭代指针算法。
  • 你能举一个你认为std::list允许的例子吗?
  • std::list 的迭代器只能单步递增或递减。你不能说it += 5it + 42。这就是我在第一条评论中的意思,我意识到这并不完全清楚。但你的问题也不是。
  • std::list 的元素具有指向前一个元素和下一个元素的指针。运算符增量it++ 使用这些指针将其移动到下一个元素。这只是一个指针赋值,实际上并没有发生任何算术运算。
  • std::list 迭代器有一个 std::bidirectional_iterator_tag,因此没有算术,只是递增/递减

标签: c++ stdvector allocation doubly-linked-list stdlist


【解决方案1】:

粗略地说,您可以假设std::list::iterator 是指向列表元素struct iterator { list::element *current }; 的指针的容器。并且一个元素具有指向下一个和上一个元素的指针,例如struct element { list::element *next, *previous }; 当您递增该迭代器时,它只是重新分配此指针以指向下一个元素。就像链表中的it->current = it->current->next。不涉及指针运算。

【讨论】:

  • @tuk 这不是一个指针。假设它有什么意义?
  • 我尝试实现我自己的 std::list 版本来执行您所描述的操作,但是当我尝试使用 iter++ 递增迭代器时,它会忽略我的特殊列表 operator++ 函数,而是尝试使用指针算术......因为迭代器是一个指针。我可以让它工作的唯一方法是增加列表对象本身,这样我的 operator++ 函数就会被调用。
  • 迭代器不是指针。在我的示例中,迭代器是一个结构,您必须按照所述覆盖operator++。运算符为 iterator 重新定义,而不是列表或列表元素。
  • 我创建了一个结构iterator,它有意封装了一个指针。因为我需要 operator++ 的不同行为,因为原始类型的默认行为可能不会改变。
  • @tuk,你可能会超载operator *()
猜你喜欢
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-16
  • 2011-10-30
  • 2012-11-24
  • 2013-07-15
  • 1970-01-01
相关资源
最近更新 更多