簡體   English   中英

從函數返回對地圖的引用

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM