gpt4 book ai didi

c++ - 如何将一般树反序列化为 vector ?

转载 作者:行者123 更新时间:2023-11-28 04:03:55 25 4
gpt4 key购买 nike

我已经将一棵树序列化为一个文件 (myFile.txt),其中每个节点实际上是一个单独的 \n 终止行:

根节点 00节点 000|节点 001||节点 01节点 010|节点 011节点 0110节点 01100||||节点 02节点 020节点 0200|节点 0201||||

它可以被反序列化为一个预定义深度的数组,如下所示:

#include <afx.h>
#include <memory>

using std::unique_ptr;

// A node of an N-ary tree
struct Node {
CString key;
unique_ptr<Node> child[N]; // Array of pointers for N children
};

// Utility function to create a new N-ary tree node
unique_ptr<Node> newNode(CString key)
{
unique_ptr<Node> temp = std::make_unique<Node>();
temp->key = key;
return temp;
}
int deSerialize(unique_ptr<Node>& root, CStdioFile* pfr)
{
// Read next item from file.
CString fs;
pfr->ReadString(fs);

// If no more items or next item is marker, return 1 to indicate same
if (fs == "" || fs == "|") { return 1; }
// else create new node and recurse for all its children
root = newNode(fs);
for (int i = 0; ; i++) // cond-expression omitted, break governs exit
if (deSerialize(root->child[i], pfr))
break;

// Finally return 0 for successful finish
return 0;
}
int main()
{
FILE* f;
errno_t err = _tfopen_s(&f, _T("myFile.txt"), _T("rt, ccs = UTF-16LE"));
if (err != NULL) { TRACE("Could not open file"); return 0; }
CStdioFile fr(f);
CStdioFile* pfr = &fr;

unique_ptr<Node> root1 = NULL;
deSerialize(root1, pfr);

fr.Close();

}

但是当我尝试从使用数组更改为 vector 时,它第一次尝试在 if 语句中递归时,deSerialize 函数抛出异常,因为 vector 下标超出范围。

#include <afx.h>
#include <memory>
#include <vector>

using std::vector;
using std::unique_ptr;

// A node of a general tree
struct Node {
CString key;
vector<unique_ptr<Node>> child; // A vector of pointers for children
};

我该如何解决?

最佳答案

[...] throws an exception because the vector subscript is out of range.

你想为 N 个 child 构建你的 vector:

vector<unique_ptr<Node>> child(N);

将构造一个大小为 Nvector,其中包含 N 默认构造的 unique_ptr

关于c++ - 如何将一般树反序列化为 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59059234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com