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

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

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

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

18.09.2013, 16:52. Просмотров 936. Ответов 5
Метки нет (Все метки)

Подскажите пожалуйста! Задача:

Имеется класс 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());
Но такого компилятор не хочет делать
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.09.2013, 16:52     Сортировка по одному из полей std::vector
Посмотрите здесь:

std::vector<char**> C++
C++ std::vector и деструкторы
C++ std::vector
std::vector::erase C++
Сортировка строк двумерного std::vector'а в лексикографическом порядке C++
std::vector пустой C++
C++ Std::vector
C++ Контейнер std::vector
C++ Сортировка по одному из полей класса
Собеседование std::vector C++
Указатель на std::vector C++
C++ Сортировка list по одному из полей

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12528 / 7090 / 797
Регистрация: 27.09.2012
Сообщений: 17,500
Записей в блоге: 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
1425 / 762 / 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);
 
};
maxrexfax
0 / 0 / 0
Регистрация: 11.12.2016
Сообщений: 2
06.02.2017, 22:18     Сортировка по одному из полей std::vector #6
//Если нужна полная русификация ВВОДА И ВЫВОДА, ТО:

//Подключаем библиотеку Windows.h

//В маине пишем:

//SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода

//SetConsoleOutputCP(1251); // установка кодовой страницы win-cp 1251 в поток вывода

//В самой консоли переключаем шрифт на Свойства-Шрифт-Lucida Console
Без последнего пункта SetConsoleCP(1251) и SetConsoleOutputCP(1251) и правда не работают.
ПыСы. А вопрос то был про вектор с указателями. То есть в векторе хранятся указатели на объекты. А не сами "люди".
Yandex
Объявления
06.02.2017, 22:18     Сортировка по одному из полей std::vector
Ответ Создать тему
Опции темы

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