Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Ak98neon
1 / 1 / 3
Регистрация: 17.12.2014
Сообщений: 68
#1

Сортировка в векторе - C++

23.02.2016, 15:13. Просмотров 314. Ответов 11
Метки нет (Все метки)

Нужно отсортировать студентов в векторе по размеру стипендии от большей к меньшей. Для этого у меня есть френд функция в классе но как реализовать эту сортировку не понимаю.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
bool sort_arr(std::vector<Students> &vec) //Сортировка по размеру стипендии от большей к меньшей
{
    int index;
    int k = 0;
    for (auto it = vec.begin(), end = vec.end(); it != end; ++it)
    {
        k++;
        if (it->stepend < it->stepend)
        {
            //swap();
        }
    }
 
    system("cls");
    std::cout << "Please Wait..." << endl;
    Sleep(700);
    system("cls");
    std::cout << "||||||||||||||||||||||||||||||||||||||||||||||||||||||||" << endl;
    std::cout << "|Студенты в группе отсротированны по размеру стипендии.|" << endl;
    std::cout << "||||||||||||||||||||||||||||||||||||||||||||||||||||||||" << endl;
    return true;
}

http://www.cyberforum.ru/cpp-beginners/thread2177289.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2016, 15:13
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Сортировка в векторе (C++):

Сортировка объектов в векторе
Есть код: #include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include &lt;functional&gt;...

Сортировка элементов в векторе
Доброго времени суток! Подскажите пожалуйста куда копать: есть вектор Vector...

Поиск в векторе
Есть вектор v: v = 0; v = 1; v = 2; v = 4; v = 6; Как с помощью...

Пары в векторе
Задан вектор в 200 чисел который рандомно заполнен в диапазоне от -50 до 50 ....

Поиск в векторе
Есть вектор v Нужно задать поиск значения 6 и присвоить переменной i номер...

11
XTO
5 / 5 / 1
Регистрация: 17.02.2016
Сообщений: 11
23.02.2016, 15:48 #2
Все просто.

1. В классе определите operator >, который сравнивает Студентов по размеру стипендии
2. Вызовите алгоритм std::sort с третьим параметром std::greater<Student>()

C++
1
2
3
4
5
6
7
8
9
10
class Student
{
public:
   double grant;
 
    bool operator > (Student const &rhs) const
    {
        return this->grant > rhs.grant;
    }
};
C++
1
std::sort( vec.begin(), vec.end(), std::greater<Student>() );
1
Ak98neon
1 / 1 / 3
Регистрация: 17.12.2014
Сообщений: 68
23.02.2016, 15:57  [ТС] #3
Сейчас попробую.

Добавлено через 6 минут
У меня проблема заключается в том что вектор хранит объекты класса
C++
1
std::vector<Students> groupArray(size_group);
и нужно сравнить именно поле stepend
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
class Students
{
private:
    string name; //Имя студента
    string group; //Имя Группы
    int stepend; //Размер стипендии
public:
    //Коснтуркторы.
    Students(); //Конструктор по умолчанию
    Students(string n, char* gr, int step); //Конструктор инициализации
    Students(const Students & obj); //Констуктор копирования
 
    void setStudents(); //Сеттер
    void getStudents(); //Геттер
 
    //Перегрузки.
    friend std::ostream & operator<<(std::ostream & os, const Students & o); //Прегрузка оператора <<
    friend std::istream & operator>>(std::istream & is, Students & o); //Перегрузка оператора >>
    bool operator>(Students & obj);
 
    //Функции работы с векторами и бд.
    friend void edit(std::vector<Students> &vec); //Функция ркдактирования
    friend void Show(std::vector<Students> &vec); //Функция Вывода
    friend void add(std::vector<Students> &vec); //Функция добавления новых элментов
    friend void poisk(std::vector<Students> &vec); //Функция поиска по имени
    friend int del(std::vector<Students> & vec); //Функция удаления по имени из группы
    friend bool sort_arr(std::vector<Students> &vec); //Функция сортировки
 
    //Функции работы с файлом.
    friend void read(std::vector<Students> & vec, ofstream & outfile); //Запись в файл
    friend void vuvod_file(std::vector<Students> & o, std::istream & is); //Чтение из файла
};
Добавлено через 20 секунд
а как это сделать не знаю

Добавлено через 1 минуту
нужно как то сравнивать в векторе с рядом стоящим объектом его значение stepend. и если оно больше ставить его вперед в векторе, но хз как это реализовать.
0
XTO
5 / 5 / 1
Регистрация: 17.02.2016
Сообщений: 11
23.02.2016, 16:02 #4
Вам нужно написать свою функцию сортировки или можно воспользоваться встроенной?
Ведь std::sort() может отсортировать студентов по стипендии.
1
Ak98neon
1 / 1 / 3
Регистрация: 17.12.2014
Сообщений: 68
23.02.2016, 16:03  [ТС] #5
вообще без разницы. Можно и так, и так
0
XTO
5 / 5 / 1
Регистрация: 17.02.2016
Сообщений: 11
23.02.2016, 16:06 #6
Но вот как-то так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Students
{
private:
    int stepend;
    
public:
    bool operator > (Students &obj)
    {
        return this->stepend > obj.stepend;
    }
};
 
int main()
{
    std::vector<Students> vec;
    
    // тут заполняется вектор
    
    // и сортируются элементы в векторе по размеру стипендии в убывающем порядке
    std::sort( vec.begin(), vec.end(), std::greater<Students>() );
}
1
Ak98neon
1 / 1 / 3
Регистрация: 17.12.2014
Сообщений: 68
23.02.2016, 16:16  [ТС] #7
7 ошибок именно в строке, почему то ему не нравится "greater<Students>())".
C++
1
std::sort(groupArray.begin(), groupArray.end(), std::greater<Students>() );
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
150
/* Задание 1 : Создать файл, в котором бы содеражались сведения о получении стипендии студентами,
имя, группа, и размеры группы. Написать программу, которые бы по фамилии студента выводила сведения о получении студентом
стипендии.
Date: 16.02.2016
Autor: Kudrya A.*/
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <iterator>
#include <Windows.h>
#include <conio.h>
#include <algorithm>
 
#include "Students.h" //Подключаем класс Students.
 
using namespace std;
 
void loading();
 
int main()  //Главная функция
{
    SetConsoleCP(1251); //Подключение отображения русского языка.
    SetConsoleOutputCP(1251);
 
    ofstream outfile;
    ifstream ifile;
 
    int k;
    system("color F0"); //Enter Color White
    string c, p;
    std::string seach;
    char vubor;
    char error[4] = { '.','.','.','.' };
    int size_group = 0;
    
    std::vector<Students> groupArray(size_group);
    groupArray.reserve(10);
 
    loading();
 
    do //Меню
    {
        system("cls");
        std::cout << "Добро Пожаловать в базу данных группы!!!" << endl;
        std::cout << "------------------------------------------------------" << endl;
        std::cout << "\t1 - Добавить студентов." << endl;
        std::cout << "\t2 - Вывести группу." << endl;
        std::cout << "\t3 - Найти студента (по имени)." << endl;
        std::cout << "\t4 - Удалить студента из группы (по имени)." << endl;
        std::cout << "\t5 - Редактирование студента" << endl;
        std::cout << "\t6 - Запись в файл." << endl;
        std::cout << "\t7 - Считать из файла." << endl;
        std::cout << "\t8 - Сортировка студентов по размеру стипендии." << endl;
        std::cout << "\t9 - Выход из Бд." << endl;
        std::cout << "------------------------------------------------------" << endl;
        std::cout << "Сделайте выбор [1 - 8]: ";
        vubor = getch();
 
        switch (vubor)
        {
        case '1':
            system("cls");
 
            do
            {
                add(groupArray);
                std::cout << "\nВвести еще одного ?[y/n]: ";
                c = getch();
                cout << endl;
            } while (c != "n");
            
            read(groupArray, outfile);
            break;
 
        case '2':
            system("cls");
            std::cout << "Размер группы " << groupArray.size() << " студ." << endl;
            Show(groupArray);
            break;
 
        case '3':
            system("cls");
            poisk(groupArray);
            break;
 
        case '4':
            system("cls");
            del(groupArray); //Удаление студента по имени
            read(groupArray, outfile);
            break;
 
        case '5': //edit
            system("cls");
            edit(groupArray); 
            read(groupArray, outfile);
            break;
 
        case '6':
            system("cls");
            read(groupArray, outfile);
            break;
 
        case '7':
            system("cls");
            vuvod_file(groupArray, ifile);
            Show(groupArray);
            break;
 
        case '8':
            system("cls");
            std::sort(groupArray.begin(), groupArray.end(), std::greater<Students>() );
            //sort_arr(groupArray, size_group); //Соритруем массив обьектов по размеру стипендии.
            read(groupArray, outfile);
            break;
 
        case '9':
            system("cls");
            std::cout << "Удачи!, ждём вас снова." << endl;
            system("exit");
            break;
 
        default:
            system("cls");
            for (int j = 0; j < 3; j++)
            {
                std::cout << "Неправильный выбор -.-" << endl;
                std::cout << "error";
                for (int i = 0; i < 4; i++)
                {
                    Sleep(200);
                    std::cout << error[i];
                }
                system("cls");
            }
            std::cout << "Неправильный выбор -.-" << endl;
            std::cout << "error...";
            break;
        }
 
        std::cout << "\nВернутся в Главное меню ?[y/n]: ";
        c = getch();
        std::cout << endl;
    } while (c != "n");
 
    groupArray.clear();
 
    system("pause");
    return 0;
}
Добавлено через 5 минут
Коды ошибок
1. Severity Code Description Project File Line
Error (active) type name is not allowed Praktika c:\Users\neon\Documents\Visual Studio 2015\Projects\Praktika\Praktika\Source.cpp 112

2.Severity Code Description Project File Line
Error C2059 syntax error: ')' Praktika c:\users\neon\documents\visual studio 2015\projects\praktika\praktika\source.cpp 112

3.Severity Code Description Project File Line
Error (active) namespace "std" has no member "greater" Praktika c:\Users\neon\Documents\Visual Studio 2015\Projects\Praktika\Praktika\Source.cpp 112

4.Severity Code Description Project File Line
Error (active) expected an expression Praktika c:\Users\neon\Documents\Visual Studio 2015\Projects\Praktika\Praktika\Source.cpp 112

5.Severity Code Description Project File Line
Error C2275 'Students': illegal use of this type as an expression Praktika c:\users\neon\documents\visual studio 2015\projects\praktika\praktika\source.cpp 112

6.Severity Code Description Project File Line
Error C2065 'greater': undeclared identifier Praktika c:\users\neon\documents\visual studio 2015\projects\praktika\praktika\source.cpp 112

7.Severity Code Description Project File Line
Error C2039 'greater': is not a member of 'std' Praktika c:\users\neon\documents\visual studio 2015\projects\praktika\praktika\source.cpp 112
0
XTO
5 / 5 / 1
Регистрация: 17.02.2016
Сообщений: 11
23.02.2016, 16:16 #8
Для std::greater() нужно подключить файл
#include <functional>
1
Ak98neon
1 / 1 / 3
Регистрация: 17.12.2014
Сообщений: 68
23.02.2016, 16:18  [ТС] #9
Теперь только одна ошибка
1.Severity Code Description Project File Line
Error C2678 binary '>': no operator found which takes a left-hand operand of type 'const Students' (or there is no acceptable conversion) Praktika c:\program files (x86)\microsoft visual studio 14.0\vc\include\xfunctional 99

походу что то я неправильно перегрузил. но как испаравить
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
#pragma once
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <iterator>
#include <iomanip>
#include <Windows.h>
 
using namespace std;
 
class Students
{
private:
    string name; //Имя студента
    string group; //Имя Группы
    int stepend; //Размер стипендии
public:
    //Коснтуркторы.
    Students(); //Конструктор по умолчанию
    Students(string n, char* gr, int step); //Конструктор инициализации
    Students(const Students & obj); //Констуктор копирования
 
    void setStudents(); //Сеттер
    void getStudents(); //Геттер
 
    //Перегрузки.
    friend std::ostream & operator<<(std::ostream & os, const Students & o); //Прегрузка оператора <<
    friend std::istream & operator>>(std::istream & is, Students & o); //Перегрузка оператора >>
    bool operator > (Students &obj)
    {
        return this->stepend > obj.stepend;
    }
 
    //Функции работы с векторами и бд.
    friend void edit(std::vector<Students> &vec); //Функция ркдактирования
    friend void Show(std::vector<Students> &vec); //Функция Вывода
    friend void add(std::vector<Students> &vec); //Функция добавления новых элментов
    friend void poisk(std::vector<Students> &vec); //Функция поиска по имени
    friend int del(std::vector<Students> & vec); //Функция удаления по имени из группы
    friend bool sort_arr(std::vector<Students> &vec); //Функция сортировки
 
    //Функции работы с файлом.
    friend void read(std::vector<Students> & vec, ofstream & outfile); //Запись в файл
    friend void vuvod_file(std::vector<Students> & o, std::istream & is); //Чтение из файла
};
0
XTO
5 / 5 / 1
Регистрация: 17.02.2016
Сообщений: 11
23.02.2016, 16:21 #10
Лучший ответ Сообщение было отмечено Ak98neon как решение

Решение

В operator > добавь константы (const). Они нужны.

C++
1
2
3
4
    bool operator > (Students const &obj) const
    {
        return this->stepend > obj.stepend;
    }
1
Ak98neon
1 / 1 / 3
Регистрация: 17.12.2014
Сообщений: 68
23.02.2016, 16:23  [ТС] #11
Да, всё верно этого не хватало. Теперь всё пашет Огромное спасибо.
0
XTO
5 / 5 / 1
Регистрация: 17.02.2016
Сообщений: 11
23.02.2016, 16:26 #12
Пожалуйста
0
23.02.2016, 16:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2016, 16:26
Привет! Вот еще темы с решениями:

Структуры в векторе
struct Node { char ch; int parent; int zero; ...

N-мерный массив в векторе
Здравствуйте. Можно ли в векторе хранить n-мерный массив. т.е. я с клавиатуры...

Подсчет слов в векторе
Здравствуйте есть вот такая задача //Написать программу, которая считывает...

Длина строки в векторе
Здравствуйте! Как узнать длину строки в векторе? vector&lt;string&gt; v; ...


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

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

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