在C ++中初始化结构数组

时间:2017-04-27 15:52:54

标签: c++ arrays struct

我的代码中有struct Node,如下所示:

struct Node {
Node() : prev(0), left(0), right(0) {}
Node* prev;
Node* left;
Node* right;
char val;
};

我初始化Node structer对象的数组:

Node** pool = new Node*[10000000];

我认为它会使用defoult构造函数创建Node结构对象,但实际上数组似乎是空的。是否有任何有效的方法来创建一系列“空”对象?

3 个答案:

答案 0 :(得分:5)

你应该使用std::vector<>;没有理由在C ++中使用new

 auto pool = std::vector<Node>(10000000);

(您的原始代码正在创建Node* s,而不是Node s。)

如果由于某种原因您不想使用vector,则可以使用std::unique_ptr<>。该代码将是

std::unique_ptr<Node[]> pool(new Node[10000000]);

确实应使用vector

此外,您可以简化和改进Node

struct Node final {
Node* prev = nullptr;
Node* left = nullptr;
Node* right = nullptr;
char val = '\0';

Node(const Node&) = delete;
Node& operator(const Node&) = delete;
};

答案 1 :(得分:0)

如果您正在构建ast / asg并且不需要线性数据结构,那么您可以考虑使用::std::vector<>批量分配内容,这可能会为您提供缓存局部性。

您仍然可以通过结构中的指针链接各个Node对象。如果然后使用索引而不是指针,那么只要池中的可用对象用尽,您甚至可以调整向量的大小。

答案 2 :(得分:0)

Node** pool = new Node*[10000000];

构造一个Node*而不是Node的数组。你在寻找的是,

Node* pool = new Node[10000000];

构造一个Node数组。如果你真的想要一个Node*的数组,那么适当的初始化是,

int nObjects = 10000000;
Node** pool = new Node[nObjects];

for(auto i = 0; i < nObjects; ++i) {
    pool[i] = new Node();
}

正如其他人所说,如果你可以避免使用new或C风格的数组,你可能不想使用它。