Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Mikhal2406
0 / 0 / 0
Регистрация: 21.02.2014
Сообщений: 2
#1

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

25.02.2014, 20:00. Просмотров 247. Ответов 0
Метки нет (Все метки)

/*не могу понять почему в свои некоторые предикаты компилятор позволяет
передавать ссылки. А в некоторые нет. Также не работает алгоритм 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.02.2014, 20:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос работа с STL. Передача пользовательских объектов в предикаты по ссылке (C++):

Предикаты STL - C++
Решил вот так простенькую задачку, в условии задачи&quot; использовать указатели на функции и осортировать массив в порядке возрастания и...

Предикаты в STL - C++
Здравствуйте, не могу понять что должна принимать функция в качестве унарного предиката или бинарного. Вот допустим контейнер LIST, можете...

STL функторы, предикаты - C++
У нас есть: std::multimap&lt;std::string,std::string&gt; map; нужно удалить все повторяющиеся ключи, используя алгоритм с предикатом. ...

Предикаты. Выборка объектов из вектора по определённому полю - C++
Здравствуйте. Имеется некий шаблон класса, один из членов которого - вектор. Т.е. что-то вроде template &lt;class T&gt; class...

Множество set из пользовательских объектов - C++
Всем хай! Сразу к делу. Есть такая структура, описывающая точку на плоскости: struct Tpoint { int x; int y; Tpoint(int px,...

Хранение пользовательских объектов в list - C++
Вот такое вот пишет: error C2679: бинарный &quot;==&quot;: не найден оператор, принимающий правый операнд типа &quot;const Person&quot; (или приемлемое...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2014, 20:00
Привет! Вот еще темы с ответами:

Реализовать поиск в массиве пользовательских объектов по заданному полю (использовать std::vector) - C++
помогите,пожалуйста,очень нужно!!!!!! Имеются сведения(модель-цена). Выделить заданное число самых дешевых моделей.(ЧЕРЕЗ ВЕКТОР)

STL. Сортировка объектов в контейнере - C++
Имеется список list из объектов Time (минуты:секунды). Через собственный метод (list.sort(предикат)) сортировка проходит успешно, а при...

STL вектор динамических объектов - C++
Нужно время от времени ложить в std::vector (или std::list) динамические объекты. Под динамическим объектом здесь понимается объект,...

Передача массива в stl::queue - C++
Доброго времени суток. Не могу разобраться с типами. Суть: надо в stl::queue отправить массив из 8 байт, и потом из этой очереди его...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru