С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 28.10.2017
Сообщений: 18

Как сделать сортировку внутри класса?

27.11.2017, 19:01. Показов 1681. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите понять как произвести сортировку внутри класса. Есть класс Person из трех векторов. После каждого добавления данных нужно отсортировать по полю god. Весь код не привожу, если нужно добавлю. Нужно реализовать функцию MySort. Сейчас сортируется только один из векторов, нужно отсортировать все три, но по первому.
C++
1
2
3
4
5
6
7
8
9
10
11
12
class Person {
private:
    void MySort() {
        sort(begin(god), end(god));
    }
    vector<int> god;
    vector<string> name;
    vector<string> family;
 
public:
 
};
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.11.2017, 19:01
Ответы с готовыми решениями:

Как сделать локализацию внутри класса/структуры?
Как сделать локализацию внутри класса/структуры?

Сделать сортировку или выбор из класса?
помогите вставить сортировку ну или выборку Создать класс, содержащий сведения о том, какие из пяти дисциплин по выбору желает изучить...

Наследование: Как мне определить любой из методов заданного класса внутри другого класса?
Добрый день, подскажите пожалуйста, что я делаю не так Есть файл Container.h в котором храню прототипы методов class Container ...

7
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
27.11.2017, 19:10
sdntver, у тебя person нифига не person, а контейнер какой-то. Храни в единичном экземпляре все характеристики + переопредели оператор < (для сравнения по god). А в другом месте объяви vector<Person> и его можно будет отсортировать.
0
0 / 0 / 0
Регистрация: 28.10.2017
Сообщений: 18
27.11.2017, 19:20  [ТС]
Ну, полностью вот класс и задача сделать именно класс без main. То есть сдавать нужно только сам класс. Сейчас main прицеплен лишь для проверки работы класса.
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
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <locale>
#include <set>
using namespace std;
 
class Person {
public:
void ChangeFirstName(int year, const string& first_name) {
// добавить факт изменения имени на first_name в год year
    if (count(begin(god), end(god), year) == 0) { // нету нашего года
        if (god.size() > 0) {
            for (int i = god.size(); i > 0; --i){
                if (god[i-1] <= year) {
                    string s;
                    if (family[i-1] == "no") s = family.back();
                    else s = family[i-1];
                    family.push_back(s);
                    break;
                }
            }
        } else family.push_back("no");
        god.push_back(year);
        name.push_back(first_name);
        MySort();
    } 
    for (int i = 0; i < god.size(); ++i) 
        if (god[i] >= year) 
            name[i] = first_name;
}
void ChangeLastName(int year, const string& last_name) {
// добавить факт изменения фамилии на last_name в год year
    if (count(begin(god), end(god), year) == 0) { // нету нашего года
        if (god.size() > 0) {
            for (int i = god.size(); i > 0; --i){
                if (god[i-1] <= year) {
                    string s;
                    if (name[i-1] == "no") s = name.back();
                    else s = name[i-1];
                    name.push_back(s);
                    break;
                }
            }
        } else name.push_back("no");
        god.push_back(year);
        family.push_back(last_name);
        MySort();
    } 
    for (int i = 0; i < god.size(); ++i) 
            if (god[i] >= year) 
                family[i] = last_name;
}
string GetFullName(int year) {
//получить имя и фамилию на конец года year
    if (year < god[0]) return "Incognito";
    int j;
    for (int i = 0; i < god.size(); ++i) if (year >= god[i]) j = i;
    
    if (family[j] == "no") {
        return name[j] + " " + "with unknown last name";
    }
    else if (name[j] == "no") {
        return family[j] + " " + "with unknown first name";
    }
    else {
        return name[j] + " " + family[j];
    }
        
}
     
private:
    void MySort() {
        sort(begin(god), end(god));
    }
    vector<int> god;
    vector<string> name;
    vector<string> family;
};
 
int main() {
  Person person;
  
  person.ChangeFirstName(1965, "Polina");
  person.ChangeLastName(1967, "Sergeeva");
  
  for (int year : {1900, 1965, 1990}) {
    cout << person.GetFullName(year) << endl;
  }
  
  person.ChangeFirstName(1970, "Appolinaria");
  
  for (int year : {1969, 1970}) {
    cout << person.GetFullName(year) << endl;
  }
  
  person.ChangeLastName(1968, "Volkova");
  
  for (int year : {1969, 1970}) {
    cout << person.GetFullName(year) << endl;
  }
  
 
  return 0;
}
предпоследняя строка выводится не правильно, так как нужна корректная сортировка
0
 Аватар для Nishen
1357 / 856 / 365
Регистрация: 26.02.2015
Сообщений: 3,813
27.11.2017, 19:27
С main, без main, вы не верно понимаете саму идею класса. Класс Person не подходит для хранения массива персон. Для этих целей может подходить класс, например, "Журнал", "Телефонная книга", "Адресная книга" и т.д. Что-то, что содержит в себе сразу много персон.
0
0 / 0 / 0
Регистрация: 28.10.2017
Сообщений: 18
27.11.2017, 19:38  [ТС]
Я с вами полностью согласен Но задача от этого не меняет условия, а условие следующее:

Реализуйте класс для человека, поддерживающий историю изменений человеком своих фамилии и имени.
Считайте, что в каждый год может произойти не более одного изменения фамилии и не более одного изменения имени. При этом с течением времени могут открываться всё новые факты из прошлого человека, поэтому года́ в последовательных вызовах методов ChangeLastName и ChangeFirstName не обязаны возрастать.

Гарантируется, что все имена и фамилии непусты.

Строка, возвращаемая методом GetFullName, должна содержать разделённые одним пробелом имя и фамилию человека по состоянию на конец данного года.
Если к данному году не случилось ни одного изменения фамилии и имени, верните строку "Incognito".
Если к данному году случилось изменение фамилии, но не было ни одного изменения имени, верните "last_name with unknown first name".
Если к данному году случилось изменение имени, но не было ни одного изменения фамилии, верните "first_name with unknown last name".

В принципе у меня все условия работают, нужна лишь правильная сортировка по году

Добавлено через 6 минут
Вот второе решение той же задачи, сначала думал что дело в логике.
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
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <locale>
#include <set>
using namespace std;
 
class Person {
public:
void ChangeFirstName(int year, const string& first_name) {
// добавить факт изменения имени на first_name в год year
    if (count(begin(god), end(god), year) == 0) { // нету нашего года
        god.push_back(year);
        name.push_back(first_name);
        family.push_back("");
        MySort();
    } else {
        for (int i = 0; i < god.size(); i++) 
        if (god[i] == year) 
            name[i] = first_name;
    }
}
void ChangeLastName(int year, const string& last_name) {
// добавить факт изменения фамилии на last_name в год year
    if (count(begin(god), end(god), year) == 0) { // нету нашего года
        god.push_back(year);
        name.push_back("");
        family.push_back(last_name);
        MySort();
    } else {
        for (int i = 0; i < god.size(); i++) 
        if (god[i] == year) 
            family[i] = last_name;
    }
}
string GetFullName(int year) {
//получить имя и фамилию на конец года year
    if (year < god[0]) return "Incognito";
    int j;
    for (int i = god.size(); i > 0; i--) 
        if (year >= god[i - 1]) {
            j = i - 1;
            break;
        }
            
    if (family[j] == "") {
        for (int i = j; i >= 0; i--){
            if (family[i] != "") return name[j] + " " + family[i];
        }
        return name[j] + " " + "with unknown last name";
    }
    else if (name[j] == "") {
        for (int i = j; i >= 0; i--){
            if (name[i] != "") return name[i] + " " + family[j];
        }
        return family[j] + " " + "with unknown first name";
    }
    else {
        return name[j] + " " + family[j];
    }
        
}
     
private:
    void MySort() {
        sort(begin(god), end(god));
    }
    vector<int> god;
    vector<string> name;
    vector<string> family;
};
 
int main() {
  Person person;
  
  person.ChangeFirstName(1965, "Polina");
  person.ChangeLastName(1967, "Sergeeva");
  
  for (int year : {1900, 1965, 1990}) {
    cout << person.GetFullName(year) << endl;
  }
  
  person.ChangeFirstName(1970, "Appolinaria");
  
  for (int year : {1969, 1970}) {
    cout << person.GetFullName(year) << endl;
  }
  
  person.ChangeLastName(1968, "Volkova");
  
  for (int year : {1969, 1970}) {
    cout << person.GetFullName(year) << endl;
  }
    
  return 0;
}
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
27.11.2017, 19:43
Цитата Сообщение от sdntver Посмотреть сообщение
нужна лишь правильная сортировка по году
Действительно, есть такие подходы: "структура масивов" и "массив структур".
В вашем случае обязательно хранить год, имя и фамилию в отдельных массивах?

Можно создать еще один класс: например, DataСhange c полем год, и т.д. и в классе Person хранить вектор этих Datachange.

Если оставлять все как было - то легче все время поддерживать отсортированное состояние.

Отсортировать тоже можно, но есть нектороые трудности.
0
0 / 0 / 0
Регистрация: 28.10.2017
Сообщений: 18
28.11.2017, 10:26  [ТС]
А можно на примере показать как сделать вектор из класса и потом его еще и отсортировать?

Добавлено через 1 час 9 минут
В общем решение нашел сам, сделал свою функцию сортировки методом пузырька. Но хотелось бы конечно увидеть более профессиональное решение, с использованием лямбда-функции sort(v.begin(), v.end(), [](int& a, int& b){return a < b;})
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
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <locale>
#include <set>
using namespace std;
 
class Person {
public:
void ChangeFirstName(int year, const string& first_name) {
// добавить факт изменения имени на first_name в год year
    if (count(begin(god), end(god), year) == 0) { // нету нашего года
        god.push_back(year);
        name.push_back(first_name);
        family.push_back("");
        MySort();
    } else {
        for (int i = 0; i < god.size(); i++) 
        if (god[i] == year) 
            name[i] = first_name;
    }
}
void ChangeLastName(int year, const string& last_name) {
// добавить факт изменения фамилии на last_name в год year
    if (count(begin(god), end(god), year) == 0) { // нету нашего года
        god.push_back(year);
        name.push_back("");
        family.push_back(last_name);
        MySort();
    } else {
        for (int i = 0; i < god.size(); i++) 
        if (god[i] == year) 
            family[i] = last_name;
    }
}
string GetFullName(int year) {
//получить имя и фамилию на конец года year
    if (year < god[0]) return "Incognito";
    int j;
    for (int i = god.size(); i > 0; i--) 
        if (year >= god[i - 1]) {
            j = i - 1;
            break;
        }
            
    if (family[j] == "") {
        for (int i = j; i >= 0; i--){
            if (family[i] != "") return name[j] + " " + family[i];
        }
        return name[j] + " " + "with unknown last name";
    }
    else if (name[j] == "") {
        for (int i = j; i >= 0; i--){
            if (name[i] != "") return name[i] + " " + family[j];
        }
        return family[j] + " " + "with unknown first name";
    }
    else {
        return name[j] + " " + family[j];
    }
        
}
     
private:
    void MySort() {
        if (god.size() > 1)
            for (int i = god.size(); i > 1; i--) 
                if (god[i-1] < god[i-2]) {
                    int a = god[i-1];
                    god[i-1] = god[i-2];
                    god[i-2] = a;
                    string b = name[i-1];
                    name[i-1] = name[i-2];
                    name[i-2] = b;
                    b = family[i-1];
                    family[i-1] = family[i-2];
                    family[i-2] = b;
                }
    }
    vector<int> god;
    vector<string> name;
    vector<string> family;
};
 
int main() {
  Person person;
  
  person.ChangeFirstName(1965, "Polina");
  person.ChangeLastName(1967, "Sergeeva");
  
  for (int year : {1900, 1965, 1990}) {
    cout << person.GetFullName(year) << endl;
  }
  
  person.ChangeFirstName(1970, "Appolinaria");
  
  for (int year : {1969, 1970}) {
    cout << person.GetFullName(year) << endl;
  }
  
  person.ChangeLastName(1968, "Volkova");
  
  for (int year : {1969, 1970}) {
    cout << person.GetFullName(year) << endl;
  }
  
 
  return 0;
}
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
28.11.2017, 10:43
Цитата Сообщение от sdntver Посмотреть сообщение
А можно на примере показать как сделать вектор из класса и потом его еще и отсортировать?
а чем стандартный не угодил?

а так отсортировать его можно:
C++
1
2
std::sort(v.rbegin(), v.rend());
std::sort(v.begin(), v.end());
Добавлено через 15 минут
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
#include <iostream>     // std::cout
#include <algorithm>    // std::sort
#include <vector>       // std::vector
 
bool myfunction (int i,int j) { return (i<j); }
 
struct myclass {
  bool operator() (int i,int j) { return (i<j);}
} myobject;
 
int main () {
  int myints[] = {32,71,12,45,26,80,53,33};
  std::vector<int> myvector (myints, myints+8);               // 32 71 12 45 26 80 53 33
 
  // using default comparison (operator <):
  std::sort (myvector.begin(), myvector.begin()+4);           //(12 32 45 71)26 80 53 33
 
  // using function as comp
  std::sort (myvector.begin()+4, myvector.end(), myfunction); // 12 32 45 71(26 33 53 80)
 
  // using object as comp
  std::sort (myvector.begin(), myvector.end(), myobject);     //(12 26 32 33 45 53 71 80)
 
  // print out content:
  std::cout << "myvector contains:";
  for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';
 
  return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.11.2017, 10:43
Помогаю со студенческими работами здесь

Как инициализировать this внутри класса
Доброго времени суток. Подскажите пожалуйста, как решить данную проблему. struct Test { void F() { this = new Test; //Как...

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

Как сделать сортировку по ФИО
using namespace std; class Student { public: string F; string I; string:O; public: ...

Как создать vector внутри класса?
#include &lt;vector&gt; using namespace std; // typedef std::vector&lt;int&gt; mantissa; class desyatichnaya_drob { public: int...

Как сделать сортировку фамилий по алфавиту?
Как сделать сортировку фамилий по алфавиту ?


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru