关于C++中的清单

Regarding Lists in C++

本文关键字:C++ 关于      更新时间:2023-10-16
list<int>::iterator it;
  for ( it = l.begin(); it != l.end(); it++ )
    cout << *it << " ";
  cout << endl;

大家好,有人可以解释一下"列表不允许随机访问"对迭代器意味着什么吗?根据我的理解,我相信这意味着列表不会像数组和向量那样将内存存储在连续的内存位置,因此您不能将 [] 运算符与列表一起使用,而是您必须遍历整个列表才能找到元素?如果是这种情况,为什么允许你增加上面的迭代器?

非常感谢!

语句

列表不允许随机访问

并不意味着您不能访问列表中的任意(即所有(元素。这通常意味着您无法同时访问列表的随机元素("常量时间"或 O(1( 是您可能在此上下文中看到的另一件事(。例如,访问第二个元素可能比访问第 1002 个元素快得多(或慢得多(。

访问某些任意元素的唯一方法是从一个明确定义的位置开始(例如 begin()rbegin()或您以前记住的某个迭代器(,然后一次向后或向前走一步。

与此形成对比,例如 std::vector允许您访问任意元素,就像在"O(1( 时间"中使用 C 数组一样(即访问元素总是需要相同的时间,无论它是哪个元素(。

C++中的列表是链表。这意味着它们不像向量数组那样将数据存储在连续的内存块中;相反,它们由许多节点组成,每个节点都有一个指向下一个和上一个节点的链接。列表本身仅保留指向第一个和最后一个节点的链接。这允许在中间插入一个元素,而无需计算昂贵的重新分配和复制其他元素。

当您递增迭代器时,您基本上只是点击指向列表下一个节点的链接。

因为迭代器不是指针 - 它只是看起来像一个指针。

当你说++it时,这只是it.operator++()的简写。 在该方法中,您可以做任何您想做的事情。 您不需要只向指针添加一个。

在 list::iterator 的情况下,它采用列表中下一个节点的地址。

好吧,不知何故,你自己回答了。

在列表中,你不能用[]"跳"到随机元素,你只能做
是获取下一个(与当前您所在的位置相比(。

从第一个元素开始,为每个元素做一些事情,直到结束是没有问题的。
为第一个元素做点什么,得到下一个,做点什么,得到下一个......

每个节点都包含下一个节点的地址。通过迭代,您可以自动跳转到下一个节点。