关于C ++中的列表

时间:2014-12-22 16:08:14

标签: c++ list stl iterator

list<int>::iterator it;
  for ( it = l.begin(); it != l.end(); it++ )
    cout << *it << " ";
  cout << endl;

大家好,有人可以解释一下&#34;列表不允许随机访问&#34;迭代器的意思?根据我的理解,我认为这意味着列表不会将内存存储在连续的内存位置(如数组和向量)中,因此您无法将[]运算符与列表一起使用,而是必须遍历整个列表以查找元素?如果是这种情况,你怎么能允许增加上面的it迭代器呢?

非常感谢!

5 个答案:

答案 0 :(得分:2)

声明

  

列表不允许随机访问

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

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

将此与例如对比std::vector允许您访问任意元素,就像在&#34; O(1)时间&#34; (即,无论它是哪个元素,它总是花费相同的时间来访问元素。)

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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

对于list :: iterator,它接受列表中下一个节点的地址。

答案 3 :(得分:0)

嗯,不知怎的,你自己回答了。

在列表中,你无法用[]“跳转”到随机元素,你可以做到 是获得下一个(与你当前的那个相比)。

从第一个元素开始,为每个元素做一些事情,直到结束没问题 为第一个元素做一些事情,获得​​下一个元素,做一些事情,获得​​下一个元素......

答案 4 :(得分:0)

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