当我们要打印列表元素
时void printCollection(T coll){
auto it=coll.begin();
while(it != coll.end())
{
cout << *it << ' ';
it++; // HERE
}
cout << endl;
}
所以,当使用它从开始到结束1时...然后列表是连续的,因为它通过它转移到内存中的下一个地址。这是真的吗?
答案 0 :(得分:4)
当你增加一个迭代器时,这只是意味着&#34;移动到集合中的下一个项目&#34;。封底下的内容实际上完全取决于集合的类型。
如果您的集合类似于连续的向量,可能是下一个(或附近的)内存地址。
如果您的收藏品是某些描述的链接列表,那么它可能会完全不同。
如果您的收藏由某些阴暗的美国政府组织控制,它可能会向位于Cheyenne山区的数据库服务器发送网络请求: - )
底线是iterator++
,与C指针不同,不必然意味着将短距离移动到后续内存位置。
举例来说,下面的课程允许你提出的那种行为:
template <typename T> struct NodeIterator {
// All we need is a current pointer.
Node<T> *m_current;
// Iterator constructor, simply stores pointer to node supplied.
NodeIterator(Node<T> *current): m_current(current) {
}
// Pre-increment: advance, return it.
const NodeIterator &operator++() {
m_current = m_current->next;
return *this;
}
// Post-increment: save current, advance, return saved.
NodeIterator operator++(int) {
NodeIterator result = *this;
m_current = m_current->next;
return result;
}
// Dereference iterator.
T &operator*() { return m_current->val; }
};
您可以从operator++
重载看到它不只是一个简单的&#34;添加几个字节&#34;到当前地址,它实际上将指针推进列表。
请记住,记忆中的内容,我认为我做得对,但您可能想要将其视为事情如何运作而不是生产的指示 - 防弹代码: - )