通过引用传递 C++ 映射并在插入后查看更改
Passing c++ map by reference and see changes after insert
大家好!
我刚接触 C++,在学习了有关引用和值传递的知识后,我遇到了一个问题。
所以基本上我是在尝试复制地图,而且我是用我的方法这样做的。至此2张地图的大小是一样的。
当我向原始地图中插入一些新值时出现问题,因为它不会更改复制的地图。
所以我的问题是如何 copy/pass 地图,新地图是真实的副本,当原始地图发生变化时,复制的版本也会发生变化。
我将附上我正在处理的代码。
代码:
#include <iostream>
#include <map>
using namespace std;
map<string, int> passMapByReference(map<string, int>& temp_map){
return temp_map;
}
void printMap(map<string, int>& temp_map ){
cout << temp_map.size() << endl;
}
int main()
{
map<string, int> copyMap;
map<string, int> map;
map["asd"] = 1;
map["dsa"] = 2;
printMap(map);
copyMap = passMapByReference(map);
printMap(copyMap);
map["ksdbj"] = 3;
map["askdnijabsd"] = 4;
printMap(map);
//this should print 4
printMap(copyMap);
return 0;
}
输出:
2
2
4
2
map
和 copyMap
是独立的对象,因此更改一个不会影响另一个。此外,您正在 return 通过函数 passMapByReference
按值 映射地图 。相反,您可以 return 通过参考 来自 passMapByReference
的地图 ,如下所示:
#include <iostream>
#include <map>
#include <string>
//------------------------v------->return by reference
std::map<std::string, int>& passMapByReference(std::map<std::string, int>& temp_map){
return temp_map;
}
void printMap(std::map<std::string, int>& temp_map ){
std::cout << temp_map.size() << std::endl;
}
int main()
{
std::map<std::string, int> map;
map["asd"] = 1;
map["dsa"] = 2;
printMap(map);
//copyMap is an lvalue reference to passMapByReference
std::map<std::string, int>& copyMap = passMapByReference(map);
printMap(copyMap);
map["ksdbj"] = 3;
map["askdnijabsd"] = 4;
printMap(map);
printMap(copyMap);//prints 4
}
以上程序的输出为:
2
2
4
4
备注
我注意到您使用了 using namespace std;
,然后创建了一个名为 map
的 map
。应该避免这种情况,因为它会造成混淆。例如,很难看出您所指的 map
是 std::map
还是名为 map
的变量。我建议使用 std::
来限定标准容器而不是使用 using namespace std;
.
参考Why is "using namespace std;" considered bad practice?
大家好!
我刚接触 C++,在学习了有关引用和值传递的知识后,我遇到了一个问题。
所以基本上我是在尝试复制地图,而且我是用我的方法这样做的。至此2张地图的大小是一样的。
当我向原始地图中插入一些新值时出现问题,因为它不会更改复制的地图。
所以我的问题是如何 copy/pass 地图,新地图是真实的副本,当原始地图发生变化时,复制的版本也会发生变化。
我将附上我正在处理的代码。
代码:
#include <iostream>
#include <map>
using namespace std;
map<string, int> passMapByReference(map<string, int>& temp_map){
return temp_map;
}
void printMap(map<string, int>& temp_map ){
cout << temp_map.size() << endl;
}
int main()
{
map<string, int> copyMap;
map<string, int> map;
map["asd"] = 1;
map["dsa"] = 2;
printMap(map);
copyMap = passMapByReference(map);
printMap(copyMap);
map["ksdbj"] = 3;
map["askdnijabsd"] = 4;
printMap(map);
//this should print 4
printMap(copyMap);
return 0;
}
输出:
2
2
4
2
map
和 copyMap
是独立的对象,因此更改一个不会影响另一个。此外,您正在 return 通过函数 passMapByReference
按值 映射地图 。相反,您可以 return 通过参考 来自 passMapByReference
的地图 ,如下所示:
#include <iostream>
#include <map>
#include <string>
//------------------------v------->return by reference
std::map<std::string, int>& passMapByReference(std::map<std::string, int>& temp_map){
return temp_map;
}
void printMap(std::map<std::string, int>& temp_map ){
std::cout << temp_map.size() << std::endl;
}
int main()
{
std::map<std::string, int> map;
map["asd"] = 1;
map["dsa"] = 2;
printMap(map);
//copyMap is an lvalue reference to passMapByReference
std::map<std::string, int>& copyMap = passMapByReference(map);
printMap(copyMap);
map["ksdbj"] = 3;
map["askdnijabsd"] = 4;
printMap(map);
printMap(copyMap);//prints 4
}
以上程序的输出为:
2
2
4
4
备注
我注意到您使用了 using namespace std;
,然后创建了一个名为 map
的 map
。应该避免这种情况,因为它会造成混淆。例如,很难看出您所指的 map
是 std::map
还是名为 map
的变量。我建议使用 std::
来限定标准容器而不是使用 using namespace std;
.
参考Why is "using namespace std;" considered bad practice?