[英]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.