list<int>::iterator it;
for ( it = l.begin(); it != l.end(); it++ )
cout << *it << " ";
cout << endl;
大家好,有人可以解释一下&#34;列表不允许随机访问&#34;迭代器的意思?根据我的理解,我认为这意味着列表不会将内存存储在连续的内存位置(如数组和向量)中,因此您无法将[]运算符与列表一起使用,而是必须遍历整个列表以查找元素?如果是这种情况,你怎么能允许增加上面的it迭代器呢?
非常感谢!
答案 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)
每个节点包含下一个节点的地址。通过迭代,您可以自动跳转到下一个节点。