STL 容器范围

Posted

技术标签:

【中文标题】STL 容器范围【英文标题】:STL Scope of containers 【发布时间】:2015-03-20 23:24:58 【问题描述】:

我只是想知道 STL 容器的范围。

例如。 //有一个函数,它创建一个 unordered_map 并传递给 set_map 以填充其中的值。

int foo() 
  unorderd_map<char,int>mymap;
  set_map(mymap);


set_map (unorderd_map<char,int> mmap)
//...setting values of map

在这种情况下,mymap 在 foo 中的范围是否仅限于函数 foo() 或者 mymap 通过引用传递给 set_map() 并且在 set_map 中所做的任何更改都将反映到 foo() 中的 mymap?

我还想知道容器是如何作为函数参数传递的,即它们是按值传递还是按引用传递。

谢谢

【问题讨论】:

您是否知道,c++ 没有单独的引用和值类型?所以这不是类型的问题,而是如何声明参数的问题。 【参考方案1】:

mymap作为副本传递给set_map,所以set_map 只能看到它自己的地图副本,而不是原始的mymap。在set_map 中所做的更改将仅应用于副本,不会影响原始mymap

要通过引用传递地图,您需要明确声明它:

set_map (unordered_map<char,int>& mmap)
                             // ^ will be passed by reference now.

现在set_map 中的更改将改变作为参数传递的原始对象。

【讨论】:

感谢您的回复。因此,当我在任何函数中创建 unordered_mapmymap 时,它的范围是该函数的本地吗?另外,您能否详细说明在创建该容器时如何将内存分配给该容器。因为我认为它的内存分配是动态的,所以它的范围也会在其他功能上? 是的,在函数内声明的对象的作用域是该函数。当该函数返回时,对象被销毁(除非对象被返回)。即使您在函数内部通过引用传递对象。 mymap 会在stack 上分配,所以不会像你想象的那样动态分配。 非常感谢。我明白了你试图解释的内容。谢谢。【参考方案2】:

您已将set_map() 的参数定义为按值传递。所以这个函数将在它自己的副本上工作。调用者将丢失其中所做的事情(mymap 不变)。

点评:容器采用动态分配,原则如下:

当您在函数范围内声明unordered_map 等容器时,它是该函数的本地容器。 当您离开此本地范围时,其所有本地对象都将被销毁,unordered_map 也是如此。 分配器将从空闲存储中分配动态元素。但是当容器被销毁时,它会销毁它的所有元素(并释放它们的内存)。 除非您的元素是指针或使用移动,否则容器按值工作。

在 C++ 中,您不应该担心标准容器是如何实现的,而应该担心它们实现的语义。因此,无论分配的实现如何,本地对象仍然是本地的。但是你可以很容易地复制它,或者通过引用传递它,正如 Zenith 已经展示的那样。

【讨论】:

感谢您的评论克里斯托夫。您能否也谈谈您对我在上面对 zenith 帖子发表的评论的看法。谢谢 非常感谢克里斯托夫。我明白你的解释。谢谢!

以上是关于STL 容器范围的主要内容,如果未能解决你的问题,请参考以下文章

怎么删除STL容器的元素

STL容器用法详解及注解(持续更新)

容器迭代器

STL容器

STL 序列容器

STL 容器