【问题标题】:How to pass a multimap into function如何将多图传递给函数
【发布时间】:2011-03-15 15:50:52
【问题描述】:

我有一个非常简单的问题。我只是学习地图和多地图,想知道如何将它们传递给函数。我的大部分时间都围绕着多图,但想要一个关于如何将它们传递给 void 函数的快速示例。

int main()
{
multimap<string,int> movies;


movies.insert(pair<string,int>("Happy Feet",6));
movies.insert(pair<string,int>("Happy Feet",4));
movies.insert(pair<string,int>("Pirates of the Caribbean",5));
movies.insert(pair<string,int>("Happy Feet",3));
movies.insert(pair<string,int>("Pirates of the Caribbean",4));
movies.insert(pair<string,int>("Happy Feet",4));
movies.insert(pair<string,int>("Flags of out Fathers",4));
movies.insert(pair<string,int>("Gigli",4));

cout<<"There are "<<movies.count("Happy Feet")<<" instances of "<<"Happy Feet"<<endl;
cout<<"There are "<<movies.count("Pirates of the Caribbean")<<" instances of "<<"Pirates of the Caribbean"<<endl;
cout<<"There are "<<movies.count("Flags of out Fathers")<<" instances of "<<"Flags of out Fathers"<<endl;
cout<<"There are "<<movies.count("Gigli")<<" instances of "<<"Gigli"<<endl;



system("PAUSE");
calculateAverage(movies);  // this is where im getting errors such as no conversions
return 1;
}
void calculateAverage(multimap<string,int> *q)
{
// this function wont calculate the average obviously. I just wanted to test it
int averageH;
int averageP;
int averageF;
int averageG;

averageH = (q->count("Happy Feet"));
averageP = (q->count("Happy Feet"));
averageF = (q->count("Happy Feet"));
averageG = (q->count("Happy Feet"));


};

【问题讨论】:

  • 提前对缩进表示歉意。

标签: c++ function parameter-passing multimap


【解决方案1】:

为什么要通过指针传递?我认为最好传递一个引用(如果地图应在函数内修改)或引用 const 否则

void calculateAverage(const multimap<string,int> & q)
{
// this function wont calculate the average obviously. I just wanted to test it
int averageH;
int averageP;
int averageF;
int averageG;

averageH = (q.count("Happy Feet"));
averageP = (q.count("Happy Feet"));
averageF = (q.count("Happy Feet"));
averageG = (q.count("Happy Feet"));
};

【讨论】:

  • 我想习惯是我唯一的答案?我一直认为在内存管理方面使用指针传递有一个优势。但我仍然远远超出了我应该理解的水平。
  • @OVERTONE:来吧!不要成为那些微优化者之一。无论如何,引用都是“内部深处”的指针,因此您编写语义,并让优化器优化所需的内容。今天的优化器令人印象深刻:)
  • @Armen Tsirunyan 错误 C3861:'calculateAverage':找不到标识符,可能我对 calcaverage 方法的定义在主方法中不可用。我通常会为这些类型的事情使用类,但这次决定采用不同的方法。
  • 这实际上可能是因为我没有在 main 之前定义 calculateAverage。所以它超出了范围?是的。解决了它。我的道歉
【解决方案2】:

通过引用传递:

void calculateAverage(const multimap<string,int> & q)

但是传递指针并不是那么糟糕。只是语法看起来不太好。

如果您选择传递指针,那么在调用站点,您必须使用以下语法:

calculateAverage(&movies);

【讨论】:

  • 或修复呼叫站点:calculateAverage(&amp;movies)。 const 参考仍然是一个更好的解决方案:void calculateAverage(const multimap&lt;string, int&gt;&amp; q)
  • @Alex 发自内心的感谢你的简单。这就像一个魅力。我现在收到另一个标识符错误,但您的答案是迄今为止最容易掌握的。谢谢
【解决方案3】:

在我看来,将 movies.begin()movies.end() 传递给 calculateAverage 函数更“本着 STL 的精神”。例如:

calculateAverage(movies.begin(),movies.end());

定义如下:

typedef multimap<string,int>::const_iterator MapIt;
void calculateAverage(const MapIt &begin, const MapIt &end)
{
...
}

【讨论】:

    【解决方案4】:

    您正在尝试将multimap&lt;string,int&gt; 类型的值作为指向该类型的指针传递,即multimap&lt;string,int&gt;*。将函数签名更改为void calculateAverage(const multimap&lt;string,int&gt;&amp; q) 并相应地修改其代码(将-&gt; 替换为.),或者这样调用它:calculateAverage(&amp;movies)

    【讨论】:

    • 我都试过了。两者在某种意义上都是正确的,但我仍然得到未找到标识符的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2015-10-02
    • 2021-12-07
    • 2018-05-05
    • 1970-01-01
    相关资源
    最近更新 更多