繁体   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