Как перенести мультимап в функцию
-
24-10-2019 - |
Вопрос
У меня довольно простой вопрос. Я просто изучаю карты и мультимапы и хочу знать, как передать их в функцию. У меня большая часть моего разума обернула вокруг мультимапа, но хотел бы быстрый пример того, как передать их в пустой функции.
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"));
};
Решение
Зачем проходить по указателю? Я думаю, что лучше передать ссылку (если карта должна быть изменена в рамках функции) или ссылка на 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"));
};
Другие советы
Пройти ссылку:
void calculateAverage(const multimap<string,int> & q)
Но затем проходной указатель не так уж и плох. Просто этот синтаксис не выглядит хорошо.
Если вы решите передать указатель, то на сайте вызова вы используете этот синтаксис:
calculateAverage(&movies);
Мне кажется больше «в духе STL» передать итераторам, movies.begin()
а также movies.end()
в calculateAverage
функция Например:
calculateAverage(movies.begin(),movies.end());
со следующим определением:
typedef multimap<string,int>::const_iterator MapIt;
void calculateAverage(const MapIt &begin, const MapIt &end)
{
...
}
Вы пытаетесь передать значение типа multimap<string,int>
Как указатель на этот тип, т.е. multimap<string,int>*
. Анкет Либо измените подпись функции на void calculateAverage(const multimap<string,int>& q)
и соответственно изменить свой код (замените ->
с .
), или назовите это так: calculateAverage(&movies)
.