STL容器范围

STL Scope of 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() 函数,或者 mymap 通过引用 set_map() 传递,并且 set_map 中所做的任何更改都将是在 foo() 中反映到 mymap ?

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

谢谢

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

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

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

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

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

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

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

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