STL中的列表如何不存储在连续的内存中?

时间:2018-01-07 12:21:14

标签: c++ c++11 stl

当我们要打印列表元素

void printCollection(T coll){
    auto it=coll.begin();
    while(it != coll.end())
    {
        cout << *it << ' ';
        it++; // HERE
    }
    cout << endl;
}

所以,当使用它从开始到结束1时...然后列表是连续的,因为它通过它转移到内存中的下一个地址。这是真的吗?

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;到当前地址,它实际上将指针推进列表。

请记住,记忆中的内容,我认为我做得对,但您可能想要将其视为事情如何运作而不是生产的指示 - 防弹代码: - )