[英]how elements are stored in list of STL in C++
我正在阅读有关C ++标准模板库中的列表的信息。 我读取了无法使用索引访问的元素。 谁能让我知道列表如何存储在内存中? 它是顺序的吗? 我知道链接列表是如何实现的。 STL中的列表是否也以相同的方式实现? 即一个指针将具有下一个元素的地址?
如果是这样,迭代器的增量如何能够指向列表中的下一个元素? 迭代器上的增量运算符是否过载?
std::list<>
是序列容器, std::vector<>
std::deque
。 它们的实现方式取决于实现方式。 但是它们的行为和所需的特性由标准定义。
例如,列表必须具有固定时间插入。 一种载体, 不需要恒定的时间插入但具有其它要求(如常量时间随机访问)。 这样的要求使实现倾向于通用算法(例如, std::list
list在传统意义上通常是一个双链表)。
通过将容器状态附加到迭代器,迭代器可以在诸如std::list<>
的容器上“工作”。 例如,列表迭代器可以通过指向底层实现中当前节点的指针来知道其迭代容器及其在序列枚举中的“位置”。 推进迭代器只是意味着让它在内部节点指针中移动到该指针的“下一个”。
不要在强制性行为下的实现中赋予过多含义。 只要满足了行为要求,从根本上说,底层实现就可以是任何东西 。
std::list
通常实现为链接列表,每个节点都存储一个列表元素以及指向上一个和下一个节点的指针。 通常在链表的开头和结尾都使用带有虚假节点的链表来实现(这使实现更加简单和美观)。 在gcc实现中,它们仅使用一个节点作为起始和结束伪节点,因此该列表实际上是循环的。 该伪节点不包含任何列表元素(如果包含该列表元素,则由于许多原因会造成问题)。 该节点具有非模板类型(让我们说basic_node
),如下所示:
struct basic_node
{
basic_node * prev, * next;
};
其他包含值的节点被模板化:
template <typename T>
struct node : basic_node
{
T value;
};
std::list::iterator
存储指向basic_node
的指针。 这具有以下优点:迭代器的大多数代码独立于template参数。 例如,要增加迭代器,我们可以做类似node_ptr = node_ptr->next;
,其中node_ptr
类型为basic_node
。
取消引用时, std::list<T>::iterator
可以将指向节点的指针return static_cast<node<T> *>(node_ptr)->value;
为适当的模板化节点: return static_cast<node<T> *>(node_ptr)->value;
。
列表没有顺序存储。 如果您要的是您正在寻找std::vector
。
在文档中 ,“列表是序列容器,允许在序列中的任何位置进行恒定时间的插入和擦除操作,并且可以双向迭代。列表容器被实现为双向链接的列表”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.