Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.02.2014, 15:29   #1
Mikhal2406
 
Регистрация: 21.02.2014
Сообщений: 3
По умолчанию работа с STL

/*не могу понять почему в свои некоторые предикаты компилятор позволяет
передавать ссылки. А в некоторые нет. Также не работает алгоритм transform ( выдает binary '=' : no operator found which takes a left-hand operand of type 'const Driver' (or there is no acceptable conversion)).Скидываю сюда заголовочный файл где объявлен класс Driver. И главный cpp. Буду очень благодарен за конструктивную критику и помощь.*/
Код:
//Driver.h
#pragma once;
#include <iostream>
#include <string>
using namespace std;
class Driver
{
private:
	int number_of_journey;
	string name;
	int number_of_auto;
	string mark_of_auto;
public:
	Driver()
	{    }
	Driver(int n,string s,int n1,string s1)
	{
		number_of_journey=n;
		name=s;
		number_of_auto=n1;
		mark_of_auto=s1;
	}
	Driver(const Driver& a)
	{
		number_of_journey=a.number_of_journey;
		name=a.name;
		number_of_auto=a.number_of_auto;
		mark_of_auto=a.mark_of_auto;
	}
	~Driver()
	{    }
	friend ostream& operator<<(ostream& s,const Driver& a)
	{
		s<<a.number_of_journey<<endl;
		s<<a.name<<endl;
		s<<a.number_of_auto<<endl;
		s<<a.mark_of_auto<<endl;
		return s;
	}
	friend istream& operator>>(istream& s,Driver& a)
	{
		s>>a.number_of_journey;
		s>>a.name;
		s>>a.number_of_auto;
		s>>a.mark_of_auto;
		return s;
	}
	int number_of_autobus()
	{
		return number_of_auto;
	}
	int number_of_travelling()
	{
		return number_of_journey;
	}
	Driver& operator =(const Driver& a)
	{
		number_of_journey=a.number_of_journey;
		name=a.name;
		number_of_auto=a.number_of_auto;
		mark_of_auto=a.mark_of_auto;
		return *this;
	}
	string& get_name()
	{
		return name;
	}
	string& mark_auto()
	{
		return mark_of_auto;
	}
};
Код:
//main.cpp
#include "Driver.h"
#include <vector>
#include <list>
#include <deque>
#include <algorithm>
#include <iterator>
#include <fstream>
#include <set>
#include <functional>
bool auto_predicate(Driver& a,Driver& b)
{
	return a.number_of_autobus()>b.number_of_autobus();
}
bool travelling_predicate(Driver& a,Driver& b)
{
	return a.number_of_travelling()>b.number_of_travelling();
}
void show_number_of_travel(Driver a)
{
	cout<<a.number_of_travelling()<<endl;
}
void show_neccessar_autobuses(Driver a,int numb)
{
	if(a.number_of_travelling()==numb)
		cout<<a.number_of_autobus()<<endl;
}
void show_neccessar_drivers(Driver a,int numb)
{
	if(a.number_of_travelling()==numb)
		cout<<a.get_name()<<endl;
}
void show_neccessar_drivers_auto(Driver a,string name)
{
	if(a.mark_auto()==name)
		cout<<a.get_name()<<endl;
}
Driver modify_name(Driver a,string new_name)
{
	a.get_name()=new_name;
	return a;
}
Driver modify_car(Driver a,string new_car)
{
	a.mark_auto()=new_car;
	return a;
}
class Driver_compare
{
public:
	bool operator()(Driver a,Driver b)
	{
		return a.get_name()>b.get_name();
	}
};
int main()
{
	ifstream file;
	file.open("Drivers_info.txt");
	vector<Driver> myvector;
	istream_iterator<Driver> istiter(file);
	istream_iterator <Driver> end_of_file;
	copy(istiter,end_of_file,back_inserter(myvector));
	deque<Driver> mydeque(myvector.begin(),myvector.end());
	list<Driver> mylist(myvector.begin(),myvector.end());
	cout<<"Sorting according to the number of auto"<<endl;
	mylist.sort(auto_predicate);
	ostream_iterator<Driver> ostiter(cout,"\n");
	copy(mylist.begin(),mylist.end(),ostiter);
	cout<<"Sorting according to the travelling number"<<endl;
	sort(mydeque.begin(),mydeque.end(),travelling_predicate);
	copy(mydeque.begin(),mydeque.end(),ostream_iterator<Driver>(cout,"\n"));
	set<Driver,Driver_compare> myset(mydeque.begin(),mydeque.end());
	cout<<"Number of travel lists"<<endl;
	for_each(myset.begin(),myset.end(),show_number_of_travel);
	cout<<"Number of autobuses of '895'"<<endl;
	for_each(myset.begin(),myset.end(),bind2nd(ptr_fun(show_neccessar_autobuses),895));
	cout<<"Names of drivers of '100' "<<endl;
	for_each(myset.begin(),myset.end(),bind2nd(ptr_fun(show_neccessar_drivers),100));
	cout<<"Names of drivers of 'MAZ' "<<endl;
	for_each(myset.begin(),myset.end(),bind2nd(ptr_fun(show_neccessar_drivers_auto),"MAZ"));
	Driver Mick(150,"Mick",56,"KAMAZ");
	set<Driver,Driver_compare>::iterator iter;
	iter=myset.find(Mick);
	if(iter!=myset.end())
	{
		myset.erase(iter);
		cout<<"Set after removement of Mick"<<endl;
		for(iter=myset.begin();iter!=myset.end();iter++)
			cout<<*iter<<endl;
	}
	cout<<"Changing the name of drivers to 'King' "<<endl;
	set<Driver,Driver_compare> new_set;
	transform(myset.begin(),myset.end(),myset.begin(),bind2nd(ptr_fun(modify_name),"King"));

	return 0;
}

Последний раз редактировалось Stilet; 25.02.2014 в 17:14.
Mikhal2406 вне форума Ответить с цитированием
Старый 25.02.2014, 21:00   #2
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Зачем ты передаешь структуры по значению почти везде, если достаточно константной ссылки (ну или неконстантной в modify_xxx)?
Son Of Pain вне форума Ответить с цитированием
Старый 25.02.2014, 22:58   #3
Mikhal2406
 
Регистрация: 21.02.2014
Сообщений: 3
По умолчанию

когда передаю в предикаты ссылки на объекты выскакивают ошибки. одна из них описана выше. а в универе препод говорит что не надо страдать херней и передавать по значению
Mikhal2406 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна помощь,студент,работа с библиотекой STL Gonta52 Помощь студентам 0 07.01.2014 16:47
работа с STL очередями Yaroslav992 Общие вопросы C/C++ 5 15.09.2012 20:19
Ошибка работы программы. Работа с библиотекой STL и шаблонами. С ++ Vasyl'eva Помощь студентам 1 25.12.2011 18:39
Работа с классами и STL Blad47 Помощь студентам 3 31.03.2011 01:07
Работа со списками методами STL JeyKip Общие вопросы C/C++ 5 17.12.2009 02:13