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 已经展示的那样。
我只是想知道 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 已经展示的那样。