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

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

Войти
Регистрация
Восстановить пароль
 
 
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
#1

Массив структур - C++

04.04.2013, 14:48. Просмотров 643. Ответов 22
Метки нет (Все метки)

Как отсортировать массив структур или вектор (значения не имеет) по полю типа float? Спасибо
Вот нашёл пример на форуме, но не могу понять выделенные строки и по какому полю идёт сортировка(думаю по полю points)
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
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <iterator>
#include <vector>
#include <sstream>
#include <algorithm>
 
using namespace std;
 
struct Person{
        std::string surname,name;
        unsigned school,points;
        bool operator< (const Person& a) const{//
          return points < a.points;//
        }//
};
 
int main(){
        std::vector<Person> arr;
        int N;
        std::cin >> N;
        arr.resize(N);
        for (int i = 0; i < N; i++)
        std::cin >> arr[i].surname >> arr[i].name >> arr[i].school >> arr[i].points;
        std::sort(arr.begin(),arr.end()); 
        return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
04.04.2013, 15:12     Массив структур #2
Нужно написать предикат для std::sort. В этом коде вообще не ясно по чём оно сортирует.
Afflicted
Обитатель форума
199 / 182 / 8
Регистрация: 28.10.2012
Сообщений: 540
04.04.2013, 15:39     Массив структур #3
Цитата Сообщение от танкист34 Посмотреть сообщение
C++
1
2
3
4
bool operator < (const Person& a) const
{ 
    return points < a.points;
}
это перегрузка оператора "меньше"

Хотя не понимаю для чего он тут нужен, если не используется.
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
04.04.2013, 16:27  [ТС]     Массив структур #4
Цитата Сообщение от xtorne21st Посмотреть сообщение
Нужно написать предикат для std::sort. В этом коде вообще не ясно по чём оно сортирует.
а можете сказать, где прочесть про предикаты для сортировки с примерами?? и вообще можно ли отсортировать пузырьковым методом?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
04.04.2013, 16:30     Массив структур #5
А какого предикаты делают на плюсах? Это не пролог.
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
04.04.2013, 16:31  [ТС]     Массив структур #6
Цитата Сообщение от taras atavin Посмотреть сообщение
А какого предикаты делают на плюсах? Это не пролог.
блин я ничего не понимаю, мне нужна сортировка, а про предикаты я даже не слышал
eocron
Кактус
 Аватар для eocron
66 / 66 / 6
Регистрация: 23.05.2012
Сообщений: 343
04.04.2013, 16:32     Массив структур #7
Сортирует эту штука по points. Именно для этого и нужен перегруженный оператор. А иначе без него, как бы вы отличили двух человек? Как сказать машине, что один из них больше другого, по какому признаку? Для этого и нужна перегрузка оператаро <, так как именно этот оператор используется в функции sort, чтобы различать этих People по старшинству.

Забудьте про предикаты. Это не тот язык, где вам вообще стоит о них думать.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
04.04.2013, 16:37     Массив структур #8
http://www.cplusplus.com/forum/beginner/42159/

Цитата Сообщение от танкист34 Посмотреть сообщение
и вообще можно ли отсортировать пузырьковым методом?
Конечно.
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
04.04.2013, 16:37  [ТС]     Массив структур #9
Цитата Сообщение от eocron Посмотреть сообщение
Сортирует эту штука по points. Именно для этого и нужен перегруженный оператор. А иначе без него, как бы вы отличили двух человек? Как сказать машине, что один из них больше другого, по какому признаку? Для этого и нужна перегрузка оператаро <, так как именно этот оператор используется в функции sort, чтобы различать этих People по старшинству.

Забудьте про предикаты. Это не тот язык, где вам вообще стоит о них думать.
а почему нигде больше эта конструкция не фигурирует?? дальше по коду передаётся же функции sort только итератор на начало и конец?
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
04.04.2013, 16:42     Массив структур #10
Цитата Сообщение от eocron Посмотреть сообщение
Сортирует эту штука по points.
Пронёсся быстрым взглядом, сразу и не заметил.
Цитата Сообщение от eocron Посмотреть сообщение
Забудьте про предикаты.
А как по мне, очень полезная и удобная вещь, которая должна быть в арсенале обязательно.

Добавлено через 1 минуту
Цитата Сообщение от танкист34 Посмотреть сообщение
а почему нигде больше эта конструкция не фигурирует?? дальше по коду передаётся же функции sort только итератор на начало и конец?
std::sort так реализован, что он сравнивает два объекта, а перегруженный оператор способствует этому.
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
04.04.2013, 16:45  [ТС]     Массив структур #11
Цитата Сообщение от xtorne21st Посмотреть сообщение
Пронёсся быстрым взглядом, сразу и не заметил.

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

Добавлено через 1 минуту

std::sort так реализован, что он сравнивает два объекта, а перегруженный оператор способствует этому.
А почему это всё дело объявлено в структуре?? ведь структура это тип данных, а перегруженный оператор там откуда? И если я заменю тип unsigned на float поля points он будет верно сортировать?
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
04.04.2013, 16:45     Массив структур #12
т.е. теоретически получается, что сам предикат/компаранд находится в классе и реализован посредством перегруженного оператора <
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
04.04.2013, 16:48  [ТС]     Массив структур #13
Цитата Сообщение от xtorne21st Посмотреть сообщение
т.е. теоретически получается, что сам предикат/компаранд находится в классе и реализован посредством перегруженного оператора <
а проще чтоб было понятно начинающему без всяких предикатов там и наворотов в структуре можно реализовать? Я то не мастер, перегруженными операторами фактически не пользовался, только когда cin и cout применял.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
04.04.2013, 16:49     Массив структур #14
Цитата Сообщение от танкист34 Посмотреть сообщение
А почему это всё дело объявлено в структуре?? ведь структура это тип данных, а перегруженный оператор там откуда?
struct, class, union - это всё пользовательские типы данных. Только class по умолчанию - закрытый тип, А остальные два - открытые.
Цитата Сообщение от танкист34 Посмотреть сообщение
И если я заменю тип unsigned на float поля points он будет верно сортировать?
А почему нет?

Добавлено через 1 минуту
Цитата Сообщение от танкист34 Посмотреть сообщение
а проще чтоб было понятно начинающему без всяких предикатов там и наворотов в структуре можно реализовать?
Почитайте о предикатах и вы поймёте, что там нет ничего сложного.
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
04.04.2013, 18:13  [ТС]     Массив структур #15
Цитата Сообщение от xtorne21st Посмотреть сообщение
struct, class, union - это всё пользовательские типы данных. Только class по умолчанию - закрытый тип, А остальные два - открытые.

А почему нет?

Добавлено через 1 минуту

Почитайте о предикатах и вы поймёте, что там нет ничего сложного.
значит если я прочту о предикатах то пойму ту конструкцию в структуре?? или всё таки нет?

Добавлено через 1 час 22 минуты
народ, ну кто нить скажет как отсортировать структуру по одному из полей?? помогите плиз
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
04.04.2013, 19:40     Массив структур #16
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
#include <iostream>
#include <algorithm>
 
class Foo
{
    public:
    int a;
    float b;
};
 
Foo arr[5] = {
    {5, 12.3},
    {6, 13.1},
    {-3, 19.4},
    {16, -4.3},
    {23, 34.9}
};
 
bool comp1(const Foo& left, const Foo& right)
{
    return left.a < right.a;
}
 
void comp2(const Foo& obj)
{
    std::cout << obj.a << "\t" << obj.b << '\n';
}
 
int main()
{
    std::sort(arr, arr + 5, comp1);
    std::for_each(arr, arr + 5, comp2);
}
eocron
Кактус
 Аватар для eocron
66 / 66 / 6
Регистрация: 23.05.2012
Сообщений: 343
04.04.2013, 19:50     Массив структур #17
xtorne21st, Это полезная вещь, но человек сейчас, по видимому, учится. Ему не нужно захламлять голову лишним. А так я с вами согласен - безусловно, дополнительные знания открывают новые возможности.
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
04.04.2013, 19:51  [ТС]     Массив структур #18
Цитата Сообщение от eocron Посмотреть сообщение
xtorne21st, Это полезная вещь, но человек сейчас, по видимому, учится. Ему не нужно захламлять голову лишним. А так я с вами согласен - безусловно, дополнительные знания открывают новые возможности.
а можете уточнить что тут дополнительного??
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
04.04.2013, 19:58     Массив структур #19
танкист34, Указатели на функцию которые принимают алгоритмы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2013, 20:01     Массив структур
Еще ссылки по теме:

C++ Блочная сортировка структур (Отсортировать массив структур по фамилии)
Массив структур C++
Массив структур в массиве структур C++
Как передать массив структур в функцию в качестве параметра, чтобы изменения в функции меняли исходный массив? C++
C++ Массив структур С++

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

Или воспользуйтесь поиском по форуму:
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
04.04.2013, 20:01  [ТС]     Массив структур #20
Цитата Сообщение от xtorne21st Посмотреть сообщение
танкист34, Указатели на функцию которые принимают алгоритмы.
Мне изначально не понятен вот этот наворот:
bool operator < (const pixel& a) const { return ver < a.ver; }
никто так и не ответил что значит const, откуда берётся "a", мне только понятно что bool это тип, слово return, и поле ver.
Так то отсортировать получается, прост охото разобраться с этим делом.
Yandex
Объявления
04.04.2013, 20:01     Массив структур
Ответ Создать тему
Опции темы

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