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

Сортировка по одному из полей std::vector - C++

Восстановить пароль Регистрация
 
Gorodeckiy
0 / 0 / 0
Регистрация: 18.09.2013
Сообщений: 8
18.09.2013, 16:52     Сортировка по одному из полей std::vector #1
Подскажите пожалуйста! Задача:

Имеется класс Person с полями: Family, Name, BirthDay, Sex, ExperienceTime (Фамилия, имя, дата рождения, пол, опыт работы).
Нужно реализовать контейнер (для сущностей Person) с методом сортировки: sortX(Order order[]).
Вспомогательная структура Order: имя поля сортировки, порядок сортировки (bool)
Дополнительное указание: использовать стандартный метод (или функцию) sort, использовать аргументы типа функция (где это уместно).

Вот что я уже навоял:
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include <conio.h> 
#include <iostream>
#include <vector>
#include <algorithm>
// определение ptr_fun
#include <functional>
using namespace std;
 
class Person
{ 
public: 
    char Family; 
    char Name; 
    char BirthDay;
    char Sex;
    int ExperienceTime; 
 
    Person(char f, char n, char b, char s, int e)
    {
        Family = f;
        Name = n;
        BirthDay = b;
        Sex = s;
        ExperienceTime = e;
    };
 
    void show(void)
    { 
        cout << "||    " << Family << "   ||  " << Name << "   ||    " << BirthDay << "     ||  " << Sex << "  ||       " << ExperienceTime << "        ||\n";
    }
};
 
struct Order  
{
public:
    char SortName[15];
    bool SortOrder;
};
 
vector <Person> sortX(Order order, vector <Person> a)
{
    
        //////// Добавить сортировку!!!!
 
        if (order.SortOrder == true) 
    {
        cout << "\nField for sorting: <" << order.SortName <<">\nSorting method: <Direct>\n";       
    }
    else
    {
        cout << "\nField for sorting: <" << order.SortName <<">\nSorting method: <Reverse>\n";
    }
    return a;
}
 
void SelectName()
{
    cout << "\nSelect the field to be sorted:\n";
    cout << " 1 - Family\n";    
    cout << " 2 - Name\n";
    cout << " 3 - BirthDay\n";
    cout << " 4 - Sex\n";
    cout << " 5 - ExperienceTime\n";
    cout << " 0 - Exit\n\n";
}
 
void SelectOrder()
{
    cout << "\nselect the sort order:\n";
    cout << " 1 - Direct\n";    
    cout << " 2 - Reverse\n";
    cout << " 0 - Exit\n\n";
}
 
void showX(vector <Person> Cont)
{
    cout << "\n|| Family || Name || BirthDay || Sex || ExperienceTime ||\n";
    cout << "---------------------------------------------------------\n";
 
    for (int i = 0; i < (int)Cont.size(); ++i) 
        Cont[i].show();
    cout << "---------------------------------------------------------\n\n";
}
 
int main ()
{
    char number1;
    char number2;
    bool i = false;
    bool j = false;
    bool k = false;
    vector <Person> Container;
    Order ord;
 
    Container.push_back(Person('a','b','c','m',1));
    Container.push_back(Person('b','c','a','g',2));
    Container.push_back(Person('c','a','b','m',3));
 
    do 
    {
        showX(Container);
 
        do // Выбор поля сортировки
        {
            SelectName();
            cin >> number1;
            if (number1 != '0' && number1 != '1' && number1 != '2' && number1 != '3' && number1 != '4' && number1 != '5') 
            { cout << "\nError!\n";  i = false; }           
            else 
            {
                if (number1 == '0') { exit(1); }
                if (number1 == '1') { strcpy(ord.SortName, "Family"); i = true; }
                if (number1 == '2') { strcpy(ord.SortName, "Name"); i = true; }
                if (number1 == '3') { strcpy(ord.SortName, "BirthDay"); i = true; }
                if (number1 == '4') { strcpy(ord.SortName, "Sex"); i = true; }
                if (number1 == '5') { strcpy(ord.SortName, "ExperienceTime"); i = true; }
            } 
        } while (i != true);   
 
        do // Выбор порядка сортировки
        {
            SelectOrder();
            cin >> number2;
            if (number2 != '0' && number2 != '1' && number2 != '2') 
            { cout << "\nError!\n"; j = false; }            
            else 
            {
                if (number2 == '0') { exit(1); }
                if (number2 == '1') { ord.SortOrder = true; j = true; }
                if (number2 == '2') { ord.SortOrder = false; j = true; }            
            }
        } while (j != true);
 
        Container = sortX (ord,Container);
 
    } while (k != true);
 
};
Проблема в самой сортировке. Нигде не могу найти информации о том как сортировать методом sort по конкретному полю вектора Container.

Я представляю это примерно так:
C++
1
sort(Container.Name.begin(),Container.Name.end());
Но такого компилятор не хочет делать
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11847 / 6826 / 771
Регистрация: 27.09.2012
Сообщений: 16,929
Записей в блоге: 2
Завершенные тесты: 1
18.09.2013, 16:55     Сортировка по одному из полей std::vector #2
Напишите свой предикат и передайте его в sort
Gorodeckiy
0 / 0 / 0
Регистрация: 18.09.2013
Сообщений: 8
18.09.2013, 17:04  [ТС]     Сортировка по одному из полей std::vector #3
Цитата Сообщение от Croessmah Посмотреть сообщение
Напишите свой предикат и передайте его в sort
У меня от примеров предикатов начинает голова кружиться))

Не могли бы вы набросать примерную конструкцию или указать на источник информации, где это объясняется просто.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
18.09.2013, 17:29     Сортировка по одному из полей std::vector #4
Примерно так (через лямбду):
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
#include <iostream>
#include <string>
#include <functional>
#include <algorithm>
#include <windows.h>
 
class Person
{
   std::string fname, sname;
public:
   Person(const char* f, const char* s): fname(f), sname(s) {}
 
   std::string get_fname() const {return fname;}
   std::string get_sname() const {return sname;}
 
   void print() const {std::cout << fname << ", " << sname << std::endl;}
};
 
int main()
{
   SetConsoleCP (1251); SetConsoleOutputCP (1251);
 
   std::vector<Person> vp;
   vp.push_back(Person("Vova", "Ivanov"));
   vp.push_back(Person("Sveta", "Bulanova"));
   vp.push_back(Person("Vera", "Fifa"));
   vp.push_back(Person("Vovka", "Slimakov"));
   vp.push_back(Person("Chack", "Norris"));
 
   std::for_each(vp.begin(), vp.end(), std::mem_fn(&Person::print));
 
   //сортируем по втором имени:
   std::sort(vp.begin(), vp.end(), [](const Person& p1, const Person& p2){return p1.get_sname() < p2.get_sname();});
   std::cout << "\n\n\n";
   std::for_each(vp.begin(), vp.end(), std::mem_fn(&Person::print));
 
   return 0;
}
Gorodeckiy
0 / 0 / 0
Регистрация: 18.09.2013
Сообщений: 8
19.09.2013, 01:07  [ТС]     Сортировка по одному из полей std::vector #5
Большое спасибо DiffEreD, более менее понял. Кстати строчка:

Цитата Сообщение от DiffEreD Посмотреть сообщение
SetConsoleCP (1251); SetConsoleOutputCP (1251);
не работает.

Добавлено через 3 часа 41 минуту
Всем спасибо! Доделал, если кому пригодиться вот код:

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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#include <conio.h> 
#include <iostream>
#include <vector>
#include <algorithm>
#include <windows.h>
#include <functional>
#include <string>
using namespace std;
 
class Person
{ 
   string Family, Name, Sex;
   int BirthDay,ExpTime;
  public:
   Person( char* f,  char* n, int b, char* s, int e): Family(f), Name(n), BirthDay(b), Sex(s), ExpTime(e) {}
 
   string get_Family() const {return Family;}
   string get_Name() {return Name;}
   int get_BirthDay()  {return BirthDay;}
   string get_Sex() {return Sex;}
   int get_ExpTime() {return ExpTime;}
 
   void print() {cout << "||    " << Family << "   ||  " <<Name << "   ||    " <<BirthDay << "     ||  " <<Sex << "  ||       " <<ExpTime <<"        ||\n";}
};
 
struct Order  
{
public:
    string SortName;
    bool SortOrder;
};
 
vector <Person> sortX(Order order, vector <Person> a)
{
    if (order.SortOrder == true) 
    {       
        //cout << "\nField for sorting: <" << order.SortName <<">\nSorting method: <Direct>\n";
        if (order.SortName == "Family") 
            sort(a.begin(), a.end(), [](Person& p1, Person& p2){return p1.get_Family() < p2.get_Family();});
        if (order.SortName == "Name") 
            sort(a.begin(), a.end(), [](Person& p1, Person& p2){return p1.get_Name() < p2.get_Name();});
        if (order.SortName == "BirthDay") 
            sort(a.begin(), a.end(), [](Person& p1, Person& p2){return p1.get_BirthDay() < p2.get_BirthDay();});
        if (order.SortName == "Sex") 
            sort(a.begin(), a.end(), [](Person& p1, Person& p2){return p1.get_Sex() < p2.get_Sex();});
        if (order.SortName == "ExperienceTime") 
            sort(a.begin(), a.end(), [](Person& p1, Person& p2){return p1.get_ExpTime() < p2.get_ExpTime();});
    }
    else
    {
        //cout << "\nField for sorting: <" << order.SortName <<">\nSorting method: <Reverse>\n";
        if (order.SortName == "Family") 
            sort(a.begin(), a.end(), [](Person& p1, Person& p2){return p1.get_Family() > p2.get_Family();});
        if (order.SortName == "Name") 
            sort(a.begin(), a.end(), [](Person& p1, Person& p2){return p1.get_Name() > p2.get_Name();});
        if (order.SortName == "BirthDay") 
            sort(a.begin(), a.end(), [](Person& p1, Person& p2){return p1.get_BirthDay() > p2.get_BirthDay();});
        if (order.SortName == "Sex") 
            sort(a.begin(), a.end(), [](Person& p1, Person& p2){return p1.get_Sex() > p2.get_Sex();});
        if (order.SortName == "ExperienceTime") 
            sort(a.begin(), a.end(), [](Person& p1, Person& p2){return p1.get_ExpTime() > p2.get_ExpTime();});
    }
    return a;
}
 
void SelectName()
{
    cout << "\nSelect the field to be sorted:\n";
    cout << " 1 - Family\n";    
    cout << " 2 - Name\n";
    cout << " 3 - BirthDay\n";
    cout << " 4 - Sex\n";
    cout << " 5 - ExperienceTime\n";
    cout << " 0 - Exit\n\n";
}
 
void SelectOrder()
{
    cout << "\nselect the sort order:\n";
    cout << " 1 - Direct\n";    
    cout << " 2 - Reverse\n";
    cout << " 0 - Exit\n\n";
}
 
void showX(vector <Person> Cont)
{
    cout << "\n|| Family || Name || BirthDay || Sex || ExperienceTime ||\n";
    cout << "---------------------------------------------------------\n";
    
    for_each(Cont.begin(), Cont.end(), mem_fn(&Person::print));
    cout << "---------------------------------------------------------\n\n";
}
 
int main ()
{
    char number1;
    char number2;
    bool i = false;
    bool j = false;
    bool k = false;
    vector <Person> Container;
    Order ord;
 
    Container.push_back(Person("A","C",3,"B",5));
    Container.push_back(Person("D","A",2,"C",1));
    Container.push_back(Person("B","E",1,"D",4));
    Container.push_back(Person("E","B",4,"A",2));
    Container.push_back(Person("C","D",5,"E",3));
 
    do 
    {
        showX(Container);
 
        do // Выбор поля сортировки
        {
            SelectName();
            cin >> number1;
            if (number1 != '0' && number1 != '1' && number1 != '2' && number1 != '3' && number1 != '4' && number1 != '5') 
            { cout << "\nError!\n";  i = false; }           
            else 
            {
                if (number1 == '0') { exit(1); }
                if (number1 == '1') { ord.SortName = "Family"; i = true; }
                if (number1 == '2') { ord.SortName = "Name"; i = true; }
                if (number1 == '3') { ord.SortName = "BirthDay"; i = true; }
                if (number1 == '4') { ord.SortName = "Sex"; i = true; }
                if (number1 == '5') { ord.SortName = "ExperienceTime"; i = true; }
            } 
        } while (i != true);   
 
        do // Выбор порядка сортировки
        {
            SelectOrder();
            cin >> number2;
            if (number2 != '0' && number2 != '1' && number2 != '2') 
            { cout << "\nError!\n"; j = false; }            
            else 
            {
                if (number2 == '0') { exit(1); }
                if (number2 == '1') { ord.SortOrder = true; j = true; }
                if (number2 == '2') { ord.SortOrder = false; j = true; }            
            }
        } while (j != true);
 
        Container = sortX (ord,Container);
 
    } while (k != true);
 
};
Yandex
Объявления
19.09.2013, 01:07     Сортировка по одному из полей std::vector
Ответ Создать тему
Опции темы

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