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 容器范围的主要内容,如果未能解决你的问题,请参考以下文章