download.bg
 Вход Списание  Новини  Програми  Статии  Форум  Чат   Абонамент  Топ95   Архив 

Извеждане на съдържанието на сложен multimap

<1 2 >

Автор
Съобщение
anonymous
Вто, 06.05.08, 12:11
то взе че стана по твоя начин /без толкова ponter-u/. Въпреки, че не ми харесва, така се компи и скача като тигър
вътре ще видиш колко елементарно излъгах компилатора. сега вече трябва да нямаш проблем
#include <cstdlib>
#include <iostream>
#include <map>
 
using namespace std;
class CPlane {
public:
	   string brand;	   
	   unsigned hours;								   	
};
 
class CAirtravel{ 
public:
	string company, nation;
	map <CPlane, unsigned> plane; 
	multimap <string, unsigned> destination; 
void print() {
		map <CPlane, unsigned>::iterator iter;
		multimap <string, unsigned>::iterator iter2;
		cout<<endl<<"Name of the company: "<<company<<endl;
		cout<<endl<<"Nationality: "<<nation<<endl;		
 
		for(iter = plane.begin(); iter != plane.end(); iter++) {
			cout<<endl<<"Plane's brand: "<<iter->first.brand<<endl;	
			cout<<endl<<"Flight hours: "<<iter->first.hours<<endl;
			cout<<endl<<"Flight destinations: "<<iter->second<<endl; 
		}
 
	  for(iter2 = destination.begin(); iter2 != destination.end(); iter2++) {
			cout<<endl<<"Destination: "<<iter2->first<<endl;
			cout<<endl<<"Flights: "<<iter2->second<<endl; 
		}		
	return;
	}
};
 
class CAirport {
public:
	string name;
	unsigned flight;
	multimap <CAirtravel, unsigned> airtravel;
	
void info() {
		multimap <CAirtravel, unsigned>::iterator m;	
        CAirtravel tmp;
		cout<<endl<<"Name of airport: "<<name<<endl;
		cout<<endl<<"Flight number: "<<flight<<endl;
		cout<<endl<<"Data of companies:"<<endl;
       for(m = airtravel.begin(); m != airtravel.end(); m++) {
			cout<<endl<<"Company: "<<m->first.company<<endl;
			cout<<endl<<"Nationality: "<<m->first.nation<<endl;
			cout<<endl<<"Number of flights: "<<m->second<<endl;
			tmp = m->first;
			tmp.print();
        }
 return;
}	
};
 
int main(void){
    CAirport bla;
    bla.info();
    system("PAUSE");
    return EXIT_SUCCESS;
}

anonymous
Вто, 06.05.08, 13:35
 
void info() {
		multimap <CAirtravel, unsigned>::iterator m;	
        CAirtravel* tmp=NULL;
		cout<<endl<<"Name of airport: "<<name<<endl;
		cout<<endl<<"Flight number: "<<flight<<endl;
		cout<<endl<<"Data of companies:"<<endl;
       for(m = airtravel.begin(); m != airtravel.end(); m++) {
             tmp=NULL;
			cout<<endl<<"Company: "<<m->first.company<<endl;
			cout<<endl<<"Nationality: "<<m->first.nation<<endl;
			cout<<endl<<"Number of flights: "<<m->second<<endl;
			(*tmp) = m->first;
			if (tmp!=NULL) tmp->print();
        }
 return;
}

anonymous
Вто, 06.05.08, 14:57
Човек, направо разби задачата, благодаря отново
Въпреки че при стартиране на програмата ми изкарва Application Error - The memory could not be read, реших просто да сменя указателя към обект с истински обект и предифинирах оператора = за обекти CAirtravel:
CAirtravel operator=(CAirtravel ob) {
		company = ob.company;
		destination = ob.destination;
		plane.swap(ob.plane);
		nation.swap(ob.nation);
		return *this; 
	}
 
void info() {
 
	multimap <CAirtravel, unsigned>::iterator iair = airtravel.begin();
	CAirtravel tmp;
 
	cout<<"Airport: "<<name;
	cout<<"nFlight number: "<<flight;
	cout<<"nnData of companies:";
 
	for(; iair != airtravel.end(); iair++) {
 
		tmp = iair->first;
		tmp.print();
 
		cout<<"nnNumber of all company's flights: "<<iair->second<<endl<<endl;
 
		system("pause"); system("cls");	 
	}		
}

Oткрих и сериозна грешка при четенето на данните от файла:
while(!in.eof()) {
		in>>sx>>sy>>np;
		
		for(int i = 0; i < np; i++) {			
			in>>ta>>tb>>tc;
			sa.push_back(ta); ub.push_back(tb); uc.push_back(tc); 
		}
 
		in>>nd;
 
		for(i = 0; i < nd; i++) {
			in>>td>>te;
			sd.push_back(td); ue.push_back(te);
		}
 
		in>>broi;
 
airtravel.insert(make_pair(CAirtravel(sx, sy, np, sa.begin(), ub.begin(), uc.begin(), nd, sd.begin(), ue.begin()), broi)); 
 
sa.clear(); ub.clear(); uc.clear(); sd.clear(); ue.clear();  //
/*Бях забравил да изчиствам съдържанието на векторите преди новия цикъл. */
}

След като оправих това, проработи и тромавият ми вариант на info(), където използвам две временни карти за извеждането.

Задачата е далеч от готова, но благодарение на koko5 се вижда краят й

редактиран от anonymous на 06.05.08 15:03
редактиран от anonymous на 06.05.08 15:04
anonymous
Вто, 06.05.08, 16:59
Хм, сега пък ми се налага да преброя уникалните елементи в multimap-а destination<string, unsigned>.
Сещам се за алгоритмите unique и unique_copy, но незнам как работят с multimap.
anonymous
Вто, 06.05.08, 17:18
по същия начин, както е дадено за vector::iterator. Стойностите са в *(result_iterator->first/second) Edit:И аз не съм работил с това, ама там ще е
цък
цък
цък
цък
редактиран от anonymous на 06.05.08 17:32
anonymous
Вто, 06.05.08, 17:57
 
multimap <string, unsigned> temp;
multimap <string, unsigned> :: iterator iter;
iter = unique_copy(destination.begin(), destination.end(), temp.begin());
int uni = temp.size();

Нещо такова ми се иска да направя, но компилаторът реве

anonymous
Сря, 07.05.08, 20:16
Курсовата работа е готова най-сетне, благодаря още веднъж на koko5
Предоставям и пълния код, може да помогне на някой:
source.cpp

<1 2 >

Коментар

за нас | за разработчици | за реклама | станете автори | in english  © 1998-2024   Experta Ltd.