c++ - 访问类中的成员向量和访问在另一个成员函数中创建的向量有什么区别?
问题描述
我试图解决 Leetcode 问题589 “N-ary Tree Preorder Traversal”。我有两个具有相同逻辑的实现,如下所示:第一个是尝试访问类中的成员向量:
class sth {
public:
vector<int> nums;
vector<int>
preorder(Node *root) {
if(!root)
return nums;
nums.push_back(root->val);
for(auto i : root->children)
preorder(i);
return nums;
}
}
第二个是尝试访问在另一个成员函数中创建的向量。
class sth {
public:
void
tracking(Node *root, vector<int> &nums) {
if(!root)
return;
nums.push_back(root->val);
for(auto i : root->children) {
tracking(i, nums);
}
return;
}
vector<int>
preorder(Node *root) {
vector<int> nums;
tracking(root, nums);
return nums;
}
}
我不知道这两种实现之间的区别。他们试图描述相同的逻辑,但是时间和空间的复杂性有很大的不同。
解决方案
在第一个实现中,每个preorder
调用都按值返回一个向量。这意味着对于您访问的每个节点,您都在复制您在该点之前构建的向量。此外,由于向量是sth
对象状态的一部分,因此第二次调用preorder
将重用已包含数据的同一向量。
在第二个实现中,您只在返回向量时复制一次向量(或者根本不复制,因为可以省略副本)。而且由于没有外部状态,重复调用preorder
将返回相同的内容。
推荐阅读
- discord.js - Discord.JS 中未定义时间变量
- javascript - jQuery: 网络::ERR_CONNECTION_RESET
- javascript - 为什么在 React js 中初始化一维数组和二维数组的行为不同
- typescript - 使用函数初始化商店时如何在redux工具包中获取AppDispatch Typescript类型?
- discord.py - discord rewrite 我需要在 Bot 被踢或离开服务器时执行一项任务
- haskell - 使用 Template Haskell 获取类型信息
- python - 写入csv python3时的编解码器问题
- tensorflow - 使用 tensorfow 进行文本识别
- javascript - 第一次声明后无法覆盖 Javascript 变量
- java - 在与 java 应用程序集成时正确使用 MySQL docker 容器