按功能值传递unordered_map / unordered_set有效吗? c ++

问题描述 投票:0回答:1

按值传递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;
}

};

c++ set hashtable unordered-map unordered-set
1个回答
0
投票

答案取决于您的功能对那个容器有什么作用,它会改变容器的内容还是仅改变容器的内容?功能完成工作后,这些更改是否应该可用?

因此,如果要更改函数内部的容器,但更改不会影响原始容器,请按值或const引用传递容器,然后在函数内部复制此容器。

使用列表,在unordered_map上为矢量的容器的类型无关紧要,但是对这些数据执行的操作确实很重要

© www.soinside.com 2019 - 2024. All rights reserved.