使用std::experimental::optional来实现列表
Use std::experimental::optional to implement a list
我想知道是否可以使用std::experimental::optional
实现单(也可能是双)链表。
template <typename T>
struct node {
std::experimental::optional<node<T>> next;
T data;
};
这种设计的优点/缺点是什么?新的c++1z
功能可以用来实现哨兵吗?或者把它们一起去掉?这也会扩展到n元树吗?
以这种方式实现链表是不可能的,因为node
-类型总是不完整的。下面是一个更完整的例子来说明这个问题:
#include <iostream>
#include <experimental/optional>
template <typename T>
struct node {
std::experimental::optional<node<T>> next;
T data;
};
int main( int, char ** )
{
std::cout << sizeof( node<int> ) << std::endl;
return 0;
}
关键是optional<T>
要求T
是完整的,但在定义next
时,node
是不完整的。optional<T>
需要完整类型的原因是它将T
直接存储在optional
对象中,即它不在堆上分配内存。因此,它必须知道T
的大小。在内部,它包含一个sizeof( T )
缓冲区。在内存布局方面,你可以把optional<T>
想象成
template <class T>
struct optional
{
bool _containsValue;
char _buffer[ sizeof( T ) ];
};
但在实践中,由于存储器对准的要求,它更为复杂。
在您的情况下,为了知道optional<node>
的大小,它必须知道node
的大小,为此,它必须了解optional<node>
的大小。
optional<T>
要求T
是完整的。
根据N3672(std::optional
的建议书):
类模板optional对T的要求很小:它必须是一个左值引用类型,或者是一个满足Destrucable要求的完整对象类型。
相关文章:
- 使用简单类型列表实现的指数编译时间.为什么
- 为什么在排序链表上的这种合并实现总是将两个列表都设置为 NULL,而只有一个应该设置一个列表?
- 如何理解C++中链表的自由列表实现?
- 嵌套列表,用于在 C++ 中实现邻接列表
- 单链接列表实现,规则为 3
- 如何使用列表/数组在C++中实现 Python "... not in ..."?
- 在给定的项目列表上实现搜索?
- 如何在C / C++中正确实现链接列表而不会使程序崩溃
- 可视化 如何实现 c++ 列表的运算符=?
- 使用邻接列表C++实现 Dijkstra
- 使用初始值设定项列表作为函数参数的类对象实现运算符 [] 的示例
- 如何实现列表:<T>:迭代器?
- C++如何实现列表的数组
- 使用unique_ptr<>实现列表?
- 使用配对模板实现列表模板
- 实现列表迭代器和运算符:--++*
- 如何使用 Win32/WTL 实现列表视图的缩放
- 使用std::experimental::optional来实现列表
- 使用堆栈类实现列表类
- 实现列表:在末尾添加一个节点