C++ 关于标准库列表的问题

C++ 关于标准库列表的问题,c++,C++,在过去,我使用节点实现了一个链表 我正在查看标准库列表的一些属性,它有迭代器和适当的成员函数 列表中的迭代器到底是什么?它们是节点指针吗 对于向量,基本上有指向元素类型的指针,数据结构构建在给定类型的底层动态数组上 对于列表,它似乎只是一个节点序列,节点数组。那么迭代器是节点指针,而不是指向节点数据类型的指针吗 基本上我要问的是,对于一个向量,我是否有这个迭代器: tyepdef T* iterator; 列表的迭代器是 typedef node* iterator; 其中节点类似于: te

在过去,我使用节点实现了一个链表

我正在查看标准库列表的一些属性,它有迭代器和适当的成员函数

列表中的迭代器到底是什么?它们是节点指针吗

对于向量,基本上有指向元素类型的指针,数据结构构建在给定类型的底层动态数组上

对于列表,它似乎只是一个节点序列,节点数组。那么迭代器是节点指针,而不是指向节点数据类型的指针吗

基本上我要问的是,对于一个向量,我是否有这个迭代器:

tyepdef T* iterator;
列表的迭代器是

typedef node* iterator;
其中节点类似于:

template <class T> struct node {
    node() { next = 0; }
    node(T i, node* n = 0) : data(i), next(n) {}
    node* next;
    T data;
}
模板结构节点{
node(){next=0;}
节点(ti,node*n=0):数据(i),下一个(n){
节点*下一步;
T数据;
}
如果是这种情况,那么像解引用这样的操作似乎必须重载。

对象在内部指向一个节点,但具有适当跟随指向下一个或上一个节点的指针的运算符。也就是说,它们不是指针,因为递增指针只会添加一个指针,而不是跟随链接。您可以在引擎中创建一个列表迭代器,它看起来有点像:

template <typename T>
class list_iterator {
    friend list<T>
    Node* node; 
    list_iterator(T* node):node(node) {}
    list_iterator& operator++() {
        node = node->next;
        return *this;
    }
    T& operator*() { return *node; }
     // ...
};
模板
类列表迭代器{
好友列表
节点*节点;
列表迭代器(T*节点):节点(节点){
列表迭代器和运算符++(){
节点=节点->下一步;
归还*这个;
}
T运算符*(){return*node;}
// ...
};

列表上的迭代器的行为应该与其他序列容器(如
vector
上的迭代器)上的迭代器类似。也就是说,它的行为应该像指向list::value_类型的指针一样,就像它在数组或类似的数组中一样(使用++和-,执行预期的下一个和上一个操作)。保持结构的内部并不是真正通过迭代器公开的。迭代器抽象通常使程序员不必考虑如何存储数据。在未来,理论上,只要您只使用对两者可用的操作,就可以将
std::list
交换为
std::vector
,而无需更改代码。

欢迎来到1995。迭代器可以用节点指针来实现,事实上它们通常都是这样。但是,它们是抽象数据类型,并且绝大多数不是裸
节点
指针。如果是,则像
++
这样的运算符将不适用于它们。此迭代器类是否嵌套在列表类中?@Dochevsky:标准没有指定迭代器类型是否嵌套在类中。我也不确定它是否能被检测到。显然,真正的实现不会使用名称
list\u迭代器
(该名称没有保留),但从概念上讲,
std::list::iterator
看起来是这样的(当然,它是否真的存储了
节点*
或者,例如,
节点**
也没有指定)。