Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Gorodeckiy
0 / 0 / 0
Регистрация: 18.09.2013
Сообщений: 8
1

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

18.09.2013, 16:52. Просмотров 1255. Ответов 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());
Но такого компилятор не хочет делать

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.09.2013, 16:52
Ответы с готовыми решениями:

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в...

Как передать целочисленную матрицу типа std::vector<std::vector<int> > в функцию?
Здравствуйте. Почитал на форуме, но так и не понял что я делаю не так....

Сортировка std::vector
Есть у меня два вектора одинакового размера, например: 1) {3, 5, 0, 6} 2) {9,...

Как изменять размер std::vector<std::vector>?
Здравствуйте, как нужно изменять размер std::vector&lt;std::vector&gt; например: ...

Вывести значения std::vector<std::vector<int*> >
Подскажите, как вывести значения? const size_t row = 3; const size_t col =...

5
Croessmah
++Ͻ
14776 / 8452 / 1605
Регистрация: 27.09.2012
Сообщений: 20,800
Записей в блоге: 2
Завершенные тесты: 1
18.09.2013, 16:55 2
Напишите свой предикат и передайте его в sort
1
Gorodeckiy
0 / 0 / 0
Регистрация: 18.09.2013
Сообщений: 8
18.09.2013, 17:04  [ТС] 3
Цитата Сообщение от Croessmah Посмотреть сообщение
Напишите свой предикат и передайте его в sort
У меня от примеров предикатов начинает голова кружиться))

Не могли бы вы набросать примерную конструкцию или указать на источник информации, где это объясняется просто.
0
DiffEreD
1442 / 779 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
18.09.2013, 17:29 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;
}
1
Gorodeckiy
0 / 0 / 0
Регистрация: 18.09.2013
Сообщений: 8
19.09.2013, 01:07  [ТС] 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);
 
};
0
maxrexfax
0 / 0 / 0
Регистрация: 11.12.2016
Сообщений: 2
06.02.2017, 22:18 6
//Если нужна полная русификация ВВОДА И ВЫВОДА, ТО:

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

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

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

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

//В самой консоли переключаем шрифт на Свойства-Шрифт-Lucida Console
Без последнего пункта SetConsoleCP(1251) и SetConsoleOutputCP(1251) и правда не работают.
ПыСы. А вопрос то был про вектор с указателями. То есть в векторе хранятся указатели на объекты. А не сами "люди".
0
06.02.2017, 22:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2017, 22:18

Сортировка строк двумерного std::vector'а в лексикографическом порядке
Позвольте узнать... Возможно ли через vector&lt;vector&lt;double&gt;&gt; и функцию...

Сортировка по одному из полей
Здравствуйте! Подскажите, пожалуйста, как сделать сортировку по одному из...

Сортировка list по одному из полей
Помогите пожалуйста! У меня есть структура, содержащая несколько полей (типа...


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

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

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