【问题标题】:Is it efficient to pass an unordered_map/unordered_set by value in funciton? c++ [closed]在函数中按值传递 unordered_map/unordered_set 是否有效? c++ [关闭]
【发布时间】:2020-09-10 23:13:51
【问题描述】:

按值传递 unordered_set 是否有效?

我读到 unordered_set 包含大量的桶数组,即使元素较少也是如此。 如果它包含很少的元素(N ~ 10),那么将 unordered_set 复制到新的 unordered_set 的时间复杂度是多少? 会是 O(N) 还是其他?

(之前的问题有点模棱两可,所以我进行了编辑以使其更清楚。)

【问题讨论】:

  • 根据经验,我总是建议将类对象作为指针或引用传递。我对存储桶并没有真正的经验,但即使我们的st 有指向它们的指针,unordered_set<int> 也可能包含其他无法复制的成员。总是尽量避免复制类对象也有助于代码一致性
  • 当您通过值传递unordered_set 时,它被复制,因此它的所有内容都被复制,无论它们如何存储。 (除非复制省略当然适用)。在大多数情况下,通过引用传递会更好。
  • 实际上该函数使用不同的调用计算不同的子问题,因此通过引用传递它不会给出准确的结果...
  • @stark 实际上该函数使用不同的调用计算不同的子问题,因此通过引用传递它不会给出准确的结果 — 我完全不明白这个结论。为什么按引用传递会导致结果不准确?
  • 您的问题缺乏细节。如何传递参数取决于函数的作用,您没有提供任何详细信息。此外,为了使您的问题更加混乱,您在 function 中添加了具有不同函数调用的不同子问题,因此通过引用传递将给出不准确/不需要的结果,而没有真正解释您的意思。毫无意义的问题。添加足够的细节。

标签: c++ set hashtable unordered-map unordered-set


【解决方案1】:

答案取决于您的函数对该容器做了什么,它是更改容器内容还是仅更改容器内容?这些更改是否应该在您的函数完成工作后可用?

因此,如果您想更改函数内的容器,但更改不应影响原始容器 - 然后通过值或 const 引用传递容器,然后在函数内复制此容器。

无论你使用什么类型的容器列表,unordered_map 上的向量,但对这些数据进行的操作很重要

【讨论】:

    【解决方案2】:

    如果您总是需要st 的副本进行修改,那么您也可以在调用中进行复制。

    如果你有时需要 st 的副本来修改,最好通过 (const) 引用传递,并在需要时在正文中制作副本。

    如果您从不需要 st 的副本来修改,通常最好通过 (const) 引用传递。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      • 2020-12-28
      • 1970-01-01
      • 2014-04-13
      • 1970-01-01
      • 2017-05-17
      相关资源
      最近更新 更多