2010-06-04 93 views
3

相当直接的问题。我有一个地图,我希望通过调用一个函数像这样初始化:如何用返回类型map <>创建一个函数?

map<string, int> myMap;

myMap = initMap(&myMap);

map<string, int> initMap(map<string, int> *theMap) 
{ 
    /* do stuff... */ 

然而,编译器呻吟。有什么解决方案?

编辑1:

我很抱歉,但我搞砸了。代码正确写入*theMap,但是当我发布该问题时,我没有注意到我已经省略了*。为了回答这些评论,错误消息我得到的是:

1>Roman_Numerals.cpp(21): error C2143: syntax error : missing ';' before '<'

这是再次使用VC++ 2010 Express和同样的错误,当我定义功能在

map<char, int> initMap(map<char, int> *numerals);

抛出。

+7

编译器告诉你什么是错误信息? – PeterK 2010-06-04 14:08:52

回答

11

要么是:

map<string, int> myMap; 
initMap(myMap); 

void initMap(map<string, int>& theMap) 
{ 
    /* do stuff in theMap */ 
} 

或做:

map<string, int> myMap; 
myMap = initMap(); 

map<string, int> initMap() 
{ 
    map<string, int> theMap; 
    /* do stuff in theMap */ 
    return theMap; 
} 

即让函数初始化你给它的地图,或乘坐地图功能给你。你正在做两个(也没有return声明!)

我会去第一个选项。

1

为什么不做void initMap(地图& theMap),而不是做这么多的地图副本?

8

这可能是抱怨,因为你传递的是地图的地址,但是你的函数按值接受地图。

您可能需要更多的东西是这样的:

void initMap(map<string, int>& theMap) 
{ 
    /* do stuff...*/ 
} 
+0

感谢您的回答,但我实际上错误地重写了我的代码。它包含地图<> * theMap,我只是将指针留在了我在此处编写的代码中>< – IAE 2010-06-04 14:16:00

3

你应该接受一个指针或最好到地图的参考。你也可以为了方便返回一个参考:

map<string, int>& initMap(map<string, int>& theMap) 
... 
// Call initMap 
map<string, int> my_map; 
initMap(my_map); 
1

&myMap是一个指向地图对象的指针,而参数theMap是一个地图对象。

两个解决方案:

变化myMap = initMap(&myMap);myMap = initMap(myMap);

变化map<string, int> initMap(map<string, int> theMap)map<string, int> initMap(map<string, int> * theMap)

3

的典型解决方案只是

std::map<std::string, int> initMap(); 
// ... 
std::map<std::string, int> myMap = initMap(); 

为什么要使用的输入参数返回值棘手的尝试?性能?现代编译器不关心。事实上,不构建空白地图会稍微快一点。

-1
void initMap(map<String,int> &Map) 
{ 
    //Do something 
} 
+0

您能否扩展此答案,添加解释是什么/为什么它有效? – 2014-12-28 22:22:40

+0

您正在将映射的引用传递给init函数。 – 2014-12-31 18:31:48

+0

返回值与OP所要求的“map ”无关。请不要发布乱七八糟的东西。 – 2017-09-27 14:26:42

0

有点晚了比赛,但: 我会从错误信息,你在你的代码的顶部错过了

#include <map> 

猜测。所以编译器不知道map应该是一个模板,因此它会被后面的尖括号所困惑。

相关问题