1 / 1 / 0
Регистрация: 25.11.2014
Сообщений: 80
1

Сортировка массива (вектора) структур по заданному полю

21.04.2015, 20:11. Показов 971. Ответов 6
Метки нет (Все метки)

Нужно отсортировать массив по полю структуры. Все поля типа string.
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
struct DatabaseData{
    std::string aPointOfDeparture;//Пункт отправления
    std::string destination;      //Пункт назначения
    std::string trainNumber;              //Номер поезда
    std::string departureTime;    //Время отправления
    std::string surname;          //Фамилия и инииалы 
    std::string theTypeOfWagon;   //Тип вагона
    std::string ticketPrice;              //Стоимость билета
};
void filing(){
        /*Запись всех данных в файл*/
        std::ofstream fout("database.txt");
        for (int i = 0; i < MyVecotDb.size(); i++){
            
            fout << MyVecotDb[i].aPointOfDeparture << std::endl;
            fout << MyVecotDb[i].departureTime << std::endl;
            fout << MyVecotDb[i].destination << std::endl;
            fout << MyVecotDb[i].surname << std::endl;
            fout << MyVecotDb[i].theTypeOfWagon << std::endl;
            fout << MyVecotDb[i].ticketPrice << std::endl;
            fout << MyVecotDb[i].trainNumber << std::endl;
        }
        fout.close();
    }
void readingFromAFile(){
        /*Чтение из файла и запись в вектор*/
        DatabaseData pointerDatabaseData;
        std::ifstream fin("database.txt"); // открыли файл для чтения
        for (int i = 0; i < tellFile(); i++){
            fin >> pointerDatabaseData.aPointOfDeparture;
            fin >> pointerDatabaseData.departureTime;
            fin >> pointerDatabaseData.destination;
            fin >> pointerDatabaseData.surname;
            fin >> pointerDatabaseData.theTypeOfWagon;
            fin >> pointerDatabaseData.ticketPrice;
            fin >> pointerDatabaseData.trainNumber;
            MyVecotDb.push_back(pointerDatabaseData);
        }
        fin.close();
    }
void _swap(DatabaseData x1, DatabaseData x2){
        DatabaseData tmp;
        tmp.aPointOfDeparture = x1.aPointOfDeparture;
        x1.aPointOfDeparture = x2.aPointOfDeparture;
        x2.aPointOfDeparture = tmp.aPointOfDeparture;
 
        tmp.departureTime = x1.departureTime;
        x1.departureTime = x2.departureTime;
        x2.departureTime = tmp.departureTime;
 
        tmp.destination = x1.destination;
        x1.destination = x2.destination;
        x2.destination = tmp.destination;
 
        tmp.surname = x1.surname;
        x1.surname = x2.surname;
        x2.surname = tmp.surname;
 
        tmp.theTypeOfWagon = x1.theTypeOfWagon;
        x1.theTypeOfWagon = x2.theTypeOfWagon;
        x2.theTypeOfWagon = tmp.theTypeOfWagon;
 
        tmp.ticketPrice = x1.ticketPrice;
        x1.ticketPrice = x2.ticketPrice;
        x2.ticketPrice = tmp.ticketPrice;
 
        tmp.trainNumber = x1.trainNumber;
        x1.trainNumber = x2.trainNumber;
        x2.trainNumber = tmp.trainNumber;
    }
 
//Вот этот метод сортировки 
    void SortScena(){
        readingFromAFile();
        /*std::sort(MyVecotDb.begin(), MyVecotDb.end(), [](const DatabaseData& a, const DatabaseData& b) {
            return a.ticketPrice < b.ticketPrice;
        */});
        for (int i = 0; i < MyVecotDb.size()-1; i++){
            for (int j = i + 1; j < MyVecotDb.size(); j++){
                if (MyVecotDb[j].ticketPrice > MyVecotDb[i].ticketPrice)
                    _swap(MyVecotDb[j], MyVecotDb[i]);
            }
        }
        filing();
    }
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.04.2015, 20:11
Ответы с готовыми решениями:

Сортировка массива структур по заданному полю
Задание под вариантом такое : Упорядочить список студентов по предмету физика, и вывести весь...

Сортировка массива структур по заданному полю
Здравствуйте. Нужна помощь в сортировке. Вот само задание: Составить таблицу, содержащую...

Сортировка массива(вектора)структур по одному полю
Код:#include &lt;iostream&gt; #include &lt;sstream&gt; #include &lt;vector&gt; #include &lt;algorithm&gt; struct...

Сортировка "пузырьком" массива структур по заданному полю
Нужно отсортировать структуру по фамилии доктора, но что то он не сортирует. void...

6
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
21.04.2015, 21:30 2
C++
1
std::sort(MyVecotDb.begin(), MyVecotDb.end(), [](DatabaseData &a, DatabaseData &b) { return a.aPointOfDeparture < b.aPointOfDeparture; });
0
Форумчанин
Эксперт CЭксперт С++
8190 / 5040 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
21.04.2015, 22:01 3
Можно явно определить
C++
1
2
3
4
bool operator< (const DatabaseData &a, const DatabaseData &b)
{
    return a.aPointOfDeparture < b.aPointOfDeparture;
}
и далее любой сортировкой (хоть пузырьком). Тот же std::sort будет знать как сравнивать объекты.
0
1 / 1 / 0
Регистрация: 25.11.2014
Сообщений: 80
21.04.2015, 22:17  [ТС] 4
MrGluck, c++ ругается. Говорит много параметров в функции операторе operator подчеркивает красным.

Добавлено через 5 минут
MrGluck, если в методе делаю перезагрузку, то говорит после круглых скобок не хватает ";".
0
Форумчанин
Эксперт CЭксперт С++
8190 / 5040 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
21.04.2015, 23:12 5
Цитата Сообщение от fivebits_ Посмотреть сообщение
MrGluck, если в методе делаю перезагрузку, то говорит после круглых скобок не хватает ";".
это должно быть в глобальной области видимости (вне класса и функций).
0
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
21.04.2015, 23:17 6
А если понадобится по разным полям сортировать?
0
Форумчанин
Эксперт CЭксперт С++
8190 / 5040 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
22.04.2015, 14:19 7
Цитата Сообщение от nmcf Посмотреть сообщение
А если понадобится по разным полям сортировать?
"Если" - это уже другая задача. Здесь этого не нужно, соответственно хватит одного оператора.

"Если понадобится" - можно свой компаратор написать и передавать в функцию. И при этом всё равно оставить вариант "по умолчанию".
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.04.2015, 14:19
Помогаю со студенческими работами здесь

Реализовать сортировку массива структур по заданному полю
Помогите правильно отсортировать структуры по среднему балу и записать их в файл структура:...

Std::min_element по заданному полю массива структур
Есть структура Point{double x,y}. Есть вектор vector&lt;Point&gt;. Как правильно определить функцию...

Сортировка массива структур по полю
Дана структура: struct elecHelp1 { char fio, name, sname, nameElection, constituensy; double...

Сортировка массива структур по одному полю
Приветствую. Есть задача, практически аналогичная моей:...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru