我最近读过RAII并已开始使用它。我试图将图形定义为邻接列表,并使用unique_ptr
在堆上分配整个DS。我知道我可以将它们定义为堆栈对象,但我正在尝试使用unique_ptr
来习惯它们。
我正在做以下
unique_ptr to vector --
|-->(unique_ptr)list<edge>
|-->(unique_ptr)list<edge>
|-->(unique_ptr)list<edge>
|-->(unique_ptr)list<edge>
代码:
#include<memory>
#include<vector>
#include<list>
using namespace std;
struct edge {
int vertex;
int weight;
};
int vertices = 10;
unique_ptr<vector<unique_ptr<list<struct edge > > > >
adj_list(new vector<list<struct edge> >(10)); // THIS COMPILES
unique_ptr<vector<unique_ptr<list<struct edge > > > >
adj_list(new vector<list<struct edge> >(10, new list<edge>())); //THIS GIVES COMPILATION ERROR
任何人都可以帮我纠正这个吗?
编辑:
我怀疑矢量是RAII类。 如果我做以下
vector<int> *v;
v = new vector<int> (10);
我是否必须删除变量v
。或者它会在超出范围时自动释放堆上的内存吗?
编辑: 使用指针向量使用户负责内存管理。
答案 0 :(得分:4)
您的unique_ptr
是不必要的。只需使用对象本身:
vector<list<edge>> adj_list;
RAII并不意味着智能指针,反之亦然。 C ++在智能指针之前很久就适应了RAII。
答案 1 :(得分:2)
查看vector
的构造函数here。它们都不接受指向元素的指针。因此,要么使用vector<list<struct edge>*>
,要么将调用更改为:
list<struct edge> emptyList;
... (new vector<list<struct edge> >(10, emptyList));