Appearance
std::forward_list std::list
std::forward_list是单向链表,每个元素只包含指向下一个元素的指针,不能双向遍历,只能从头到尾进行遍历, 只能在头部进行插入删除。 占用内存大小为8字节,包含std::_Fwd_list_node_base,std::_Fwd_list_node_base中含有next指针
std::list是双向链表,每个元素包含指向前一个和后一个元素的指针,还有一个存粗元素数量的size_t,支持双向遍历, 可以在任意位置进行插入删除。 占用内存大小为24字节,包含size_t、std::__detail::_List_node_base,std::__detail::_List_node_base中含有prev与next指针
cpp
std::cout << sizeof(std::_Fwd_list_node_base) << std::endl; // 8
std::cout << sizeof(std::forward_list<int>) << std::endl; // 8
// std::forward_list next指针原理
struct Base {
Base *next;
};
struct Node : public Base {
int value;
};
Node *second = new Node();
second->value = 2;
second->next = nullptr;
Node *first = new Node();
first->value = 1;
first->next = second;
std::cout << sizeof(std::_Fwd_list_node_base) << std::endl; // 8
std::cout << sizeof(std::forward_list<int>) << std::endl; // 8
// std::forward_list next指针原理
struct Base {
Base *next;
};
struct Node : public Base {
int value;
};
Node *second = new Node();
second->value = 2;
second->next = nullptr;
Node *first = new Node();
first->value = 1;
first->next = second;
cpp
std::cout << sizeof(std::size_t) << std::endl; // 8
std::cout << sizeof(std::__detail::_List_node_base) << std::endl; // 16
std::cout << sizeof(std::list<int>) << std::endl; // 24
std::cout << sizeof(std::size_t) << std::endl; // 8
std::cout << sizeof(std::__detail::_List_node_base) << std::endl; // 16
std::cout << sizeof(std::list<int>) << std::endl; // 24