Форум программистов, компьютерный форум CyberForum.ru

работа с STL. Передача пользовательских объектов в предикаты по ссылке - C++

Восстановить пароль Регистрация
 
Mikhal2406
0 / 0 / 0
Регистрация: 21.02.2014
Сообщений: 2
25.02.2014, 20:00     работа с STL. Передача пользовательских объектов в предикаты по ссылке #1
/*не могу понять почему в свои некоторые предикаты компилятор позволяет
передавать ссылки. А в некоторые нет. Также не работает алгоритм transform ( выдает binary '=' : no operator found which takes a left-hand operand of type 'const Driver' (or there is no acceptable conversion)).Скидываю сюда заголовочный файл где объявлен класс Driver. И главный cpp. Буду очень благодарен за конструктивную критику и помощь.*/
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
//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;
    }
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
//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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.02.2014, 20:00     работа с STL. Передача пользовательских объектов в предикаты по ссылке
Посмотрите здесь:

Предикаты в STL C++
C++ Передача по ссылке
Предикаты. Выборка объектов из вектора по определённому полю C++
STL вектор динамических объектов C++
C++ Хранение пользовательских объектов в list
STL функторы, предикаты C++
C++ STL. Сортировка объектов в контейнере
C++ Передача массива в stl::queue

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 21:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru