[英]Returning a reference to a map from a function
创建地图并将其返回给函数作为参考的标准做法是什么?
在我的示例中,我只是从字符串创建字符数的哈希图,并执行两次。 我看到要从函数返回它,必须动态创建映射,否则,它将超出范围并导致未定义的行为。
但是,我不知道如何添加到地图,只有一个指向它的指针。 (请参阅代码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;
}
创建地图并将其返回给函数作为参考的标准做法是什么?
您想要做什么没有“标准做法”,因为坦率地说,这是不寻常的。
当您希望函数返回地图时,请使其返回地图:
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 std::move(new_map);
}
int main()
{
auto my_map = CreateMap(std::string("testing"));
for (const auto& iter: my_map){
cout << iter.first << " " << iter.second << endl;
}
return 0;
}
std::move
移动新创建的地图并将其交还给调用者,因此该函数不再需要保持 ref 处于活动状态。
另一种选择可能是在调用端创建映射,并通过 ref 传入:
void CreateMap(const std::string& my_string, std::map<char, int>& my_map);
用法:
std::map<char, int> my_map;
CreateMap("teststring", my_map);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.