STL容器范围

时间:2015-03-20 23:24:58

标签: c++ stl containers

我只是想知道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
}

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

我还想知道仍然将容器作为函数参数传递,即它们是按值传递还是通过引用传递。

谢谢

2 个答案:

答案 0 :(得分:2)

mymap已将作为副本传递给set_map,因此set_map只会看到自己的地图副本,而不是原始的mymapset_map中所做的更改仅适用于副本,不会影响原始mymap

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

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

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

答案 1 :(得分:1)

您已将set_map()的参数定义为按值传递。所以这个函数将在它自己的副本上工作。对于调用者(mymap未更改),将在其中执行的操作将丢失。

评论:容器使用动态分配,原则如下:

  • 当您在函数范围内声明诸如unordered_map之类的容器时,它是该函数的本地。
  • 当您离开此本地范围时,其所有本地对象都将被销毁,unordered_map也是如此。
  • 分配器将从免费商店分配动态元素。但是当容器被破坏时,它将破坏其所有元素(并释放内存)。
  • 除非您的元素是指针,或使用move,否则容器按值运行。

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