按值传递unordered_set是否有效?
void func(unordered_set<int> st)
{
//base condition.
//do something. few inserts and deletes from st.
func(st);
}
((函数通过不同的函数调用来计算不同的子问题,因此按引用传递将给出不正确/不需要的结果。)
((集合中的元素也不会超过10,我知道我可以简单地使用数组作为哈希表,但我仍然想消除混乱。)
就像在代码示例中一样,我传递了unordered_set(我将其用于恒定时间操作),但是执行(TLE)需要太多时间。但是当我将unordered_set更改为set时,它会在时限内执行。我有点困惑。
unordered_set对象是否包含指向存储桶的指针或整个存储桶数组本身?
问题可能是由于无序集(T = O(1)具有相对较高的常数)与集合(T = O(nlogn)具有相对较小的常数)相比时间复杂度常数大而O(nlogn)没有由于元素数量较少而重要吗?
或者是由于在函数中按值传递整个哈希表时复制了?
我正在解决的原始问题:
给出一个二叉树,其中节点值是从1到9的数字。如果路径中节点值的至少一个排列是回文,则将二叉树中的路径称为伪回文。
返回从根节点到叶节点的伪回文路径数。
这是我写的解决方案:
(最初为TLE,但在用set替换unordered_set后才被接受)。
课程解决方案{公开:
int ans;
bool isleaf(TreeNode* root)
{
if(root->left==NULL && root->right==NULL)
return true;
else return false;
}
void solve(TreeNode* root,unordered_set<int> odd)
{
if(root==NULL)
{
return;
}
if(odd.count(root->val))
odd.erase(root->val);
else
odd.insert(root->val);
if(isleaf(root))
{
if(odd.size()<=1)
{
ans++;
}
return;
}
solve(root->left,odd);
solve(root->right,odd);
}
int pseudoPalindromicPaths (TreeNode* root) {
ans = 0;
solve(root,{});
return ans;
}
};
答案取决于您的功能对那个容器有什么作用,它会改变容器的内容还是仅改变容器的内容?功能完成工作后,这些更改是否应该可用?
因此,如果要更改函数内部的容器,但更改不会影响原始容器,请按值或const引用传递容器,然后在函数内部复制此容器。
使用列表,在unordered_map上为矢量的容器的类型无关紧要,但是对这些数据执行的操作确实很重要