2011-03-15 3 views
0

У меня довольно простой вопрос. Я просто изучаю Карты и мультимаксы и хочу знать, как передать их в функцию. Ive получил большую часть моего ума, обернутого вокруг мультикадров, но хотел бы получить быстрый пример о том, как передать их в функцию void.Как передать multimap в функцию

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")); 


}; 
+0

Извинения заранее о отступа. – OVERTONE

ответ

3

Почему пройти мимо указателя? Я думаю, что лучше передать ссылку (если карта должна быть изменена в пределах функции) или ссылки на константные иначе

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")); 
}; 
+0

Я полагаю, что привычка будет моим единственным ответом? Я всегда думал, что есть преимущество в использовании pass by pointer в отношении управления памятью. но я все же далеко за пределами уровня, я должен понять, почему это так. – OVERTONE

+0

@ СОВЕРТОН: Давай! Не будьте одним из этих микрооптимизаторов. Ссылка в любом случае указатель «глубоко внутри», поэтому вы пишете семантику и оптимизатор оптимизирует то, что нужно. Сегодняшние оптимизаторы впечатляют :) –

+0

теперь im получение идентификатора не найдена ошибка. хммм. – OVERTONE

1

Pass по ссылке:

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

Но затем передать указатель не так уж плохо. Просто синтаксис выглядит не очень хорошо.

Если вы решили передать указатель, а затем на месте вызова, вы использовать этот синтаксис:

calculateAverage(&movies); 
+1

Или исправьте сайт вызова: 'calculateAverage (& movies)'. Ссылка на константу еще лучше: 'void calculateAverage (const multimap & q)' –

+0

@Alex Ну, от всего сердца, спасибо за простоту. который работал как шарм. Теперь я получаю еще одну ошибку idntifier, но ваш ответ был самым легким для понимания. спасибо – OVERTONE

0

Вы пытаетесь передать значение типа multimap<string,int> как указатель на этот тип, т.е. multimap<string,int>*. Либо замените подпись функции на void calculateAverage(const multimap<string,int>& q) и соответствующим образом измените ее код (замените -> на .), либо позвоните так: calculateAverage(&movies).

+0

Я пробовал оба. Оба работают в некотором смысле, что их правильные, но я все равно получаю идентификатор, который не найден. – OVERTONE

1

Мне кажется более «в духе 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) 
{ 
... 
} 
Смежные вопросы