通过引用传递 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

mapcopyMap 是独立的对象,因此更改一个不会影响另一个。此外,您正在 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
    

}

Working demo

以上程序的输出为:

2
2
4
4

备注

我注意到您使用了 using namespace std;,然后创建了一个名为 mapmap。应该避免这种情况,因为它会造成混淆。例如,很难看出您所指的 mapstd::map 还是名为 map 的变量。我建议使用 std:: 来限定标准容器而不是使用 using namespace std;.

参考Why is "using namespace std;" considered bad practice?