从函数返回对映射的引用

Returning a reference to a map from a function

本文关键字:引用 映射 函数 返回      更新时间:2023-10-16

创建映射并将其作为引用返回到函数的标准做法是什么?

在我的示例中,我只是从字符串创建字符计数的哈希图,并执行此操作两次。 我看到要从函数中返回它,必须动态创建映射,否则,它将超出范围并导致未定义的行为。

但是,我不知道如何添加到地图中,只有一个指向它的指针。(请参阅代码map[*it] += 1;(,我不确定我是否以正确的方式进行该过程。

#include <iostream>
#include <map>

std::map<char, int>& createMap(std::string& myString){
std::map<char, int>* map = new std::map<char, int>();
for(std::string::iterator it = myString.begin(); it != myString.end(); ++it){
map[*it] += 1;
}
return map;
}
void turnStringsIntoMaps(std::string a, std::string b){
std::map<char, int> firstMap = createMap(a);
std::map<char, int> secondMap = createMap(b);
for(auto it = m.begin(); it != m.end(); ++it){
std::cout << it->first << " : " << it->second << 'n';
std::cout << m[it->first] << 'n';
}
return true;
}

创建映射并将其作为引用返回到函数的标准做法是什么?

你想做什么没有"标准做法",因为坦率地说,这是不寻常的。

当你希望一个函数返回一个map时,让它返回一个map:

std::map<char, int> createMap(std::string& myString){
std::map<char, int> myMap;
// ...
return myMap;
}

返回对局部变量的引用通常是一个问题:

int& foo() { int x; return x; }

因为返回的引用悬而未决(当调用方获取引用时,x早已消失(。有关此内容的更多信息,请阅读此处。

您似乎试图通过使用动态内存分配来解决此问题。但是,这不是必需的。而是要避免!标准容器已经管理其内存,大多数时候在堆上分配容器是一种代码异味。

在不了解为什么要这样做的情况下,您有几个选择。

#include <map>
#include <iostream>
#include <string>
std::map<char, int> CreateMap(const std::string& myString){
std::map<char, int> new_map;
for(const auto& it : myString){
new_map[it] += 1;
}
return new_map; // copy elision means no performance loss
}
int main()
{
auto my_map = CreateMap(std::string("testing"));

for (const auto& iter: my_map){
cout << iter.first << "  " << iter.second << endl;
}
return 0;
}

编译器通过在与调用端的变量相同的位置构造返回的局部变量来自动跳过复制函数的返回值。

另一种选择可能是在调用端创建映射,并通过 ref 将其传入:

void CreateMap(const std::string& my_string, std::map<char, int>& my_map);

用法:

std::map<char, int> my_map;
CreateMap("teststring", my_map);