从函数返回对映射的引用
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;
}
创建映射并将其作为引用返回到函数的标准做法是什么?
你想做什么没有"标准做法",因为坦率地说,这是不寻常的。
当你希望一个函数返回一个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);
相关文章:
- 智能指针作为无序映射键,并通过引用进行比较
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 从函数返回对映射的引用
- 为什么我不能返回带有透明函子的法线映射引用?
- 通过指针或引用将映射传递给函数?
- 将从std::映射中获取的std::pair引用传递给接受std::对引用的函数
- 映射/集迭代器不可取消引用 (C++) - 调试断言失败
- 取消引用映射迭代器时返回对临时的引用
- 有没有办法在不使用循环的情况下非具体地引用映射中的每个值?C++
- lambda 和映射,引用参数 - 编译错误
- 将引用对具有shared_ptr作为值的映射转换为对具有shared_ptr const 作为值的映射的引用
- Boost Intervocess:通过迭代通过从结构引用对象的映射进行迭代时
- 使用双迭代器引用映射中的列表
- 在消息映射中创建按钮和引用
- c++存储映射元组的引用,以便在另一个函数中使用
- 由引用集/映射迭代器传递的迭代器不可取消引用
- 本机C++类与 WinRT 组件(引用类)之间的自动映射
- 引用映射中嵌套对中的值
- 没有用于引用映射的可行重载运算符
- 无法取消引用映射常量迭代器的mapped_type