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

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

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

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

18.09.2013, 16:52. Просмотров 1056. Ответов 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 (C++):

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

Как передать целочисленную матрицу типа std::vector<std::vector<int> > в функцию? - C++
Здравствуйте. Почитал на форуме, но так и не понял что я делаю не так. Имеется двумерный вектор. Размера .. Нужно его передать в...

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

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

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

Сортировка по одному из полей - C++
Здравствуйте! Подскажите, пожалуйста, как сделать сортировку по одному из полей. Никак в голову не приходит..:-| #include &quot;stdafx.h&quot; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Модератор
Эксперт CЭксперт С++
13134 / 7397 / 828
Регистрация: 27.09.2012
Сообщений: 18,228
Записей в блоге: 3
Завершенные тесты: 1
18.09.2013, 16:55 #2
Напишите свой предикат и передайте его в sort
Gorodeckiy
0 / 0 / 0
Регистрация: 18.09.2013
Сообщений: 8
18.09.2013, 17:04  [ТС] #3
Цитата Сообщение от Croessmah Посмотреть сообщение
Напишите свой предикат и передайте его в sort
У меня от примеров предикатов начинает голова кружиться))

Не могли бы вы набросать примерную конструкцию или указать на источник информации, где это объясняется просто.
DiffEreD
1430 / 767 / 95
Регистрация: 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;
}
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);
 
};
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) и правда не работают.
ПыСы. А вопрос то был про вектор с указателями. То есть в векторе хранятся указатели на объекты. А не сами "люди".
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2017, 22:18
Привет! Вот еще темы с ответами:

Std::vector<std::pair<std::vector<int>::iterator, std::vector<int>::iterator> - C++
Вопрос по вектору. Допустим есть вектор, std::vector&lt;int&gt; vec; на каком - то этапе заполнения я ставлю закладку итератора, ...

Сортировка по одному из полей класса - C++
Всем привет. Я сделал вот такой список. Вопрос как мне его отсортировать, к примеру, по Id и по Name? #include &lt;iostream&gt; #include...

Сортировка list по одному из полей - C++
Помогите пожалуйста! У меня есть структура, содержащая несколько полей (типа int, char, char). Я считываю из 2-го файла в эту структуру,...

Std::vector/QVector в классе или std::vector/QVector классов? - C++
Доброе время суток! Собственно вопрос в самой теме, есть некий класс class WorkJornal { private: string manager; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
06.02.2017, 22:18
Ответ Создать тему
Опции темы

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