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

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

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

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

04.04.2013, 14:48. Просмотров 646. Ответов 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
eocron
Кактус
66 / 66 / 6
Регистрация: 23.05.2012
Сообщений: 343
04.04.2013, 20:02     Массив структур #21
Забудьте про предикаты. Вам они в данный момент, чтобы это понять - не нужны.

Вы можете сортировать как вашей душе угодно. Метод sort выполняет сортировку элементов,только если для них определен оператор больше - [ < ]. (Подумайте сами. Вы же должны как-то сказать сортировке, чем один человек меньше второго? Рост, вес, пол или может быть деньги их различают?)

А вот КАК этот оператор "меньше" определен, как раз и задает та самая:

C++
1
2
3
4
bool operator< (const Person& a) const
{
          return points < a.points;
}
или если вам так будет понятнее:
C++
1
2
3
4
5
6
7
8
9
10
11
bool operator< (const Person& a) const
{
          if(points < a.points)
          {
                return true;
          }
          else
          {
                return false;
          }
}
, что есть то же самое, что и первый код. Она возвращает true (первый меньше второго) или false (первый больше или равен второму)

То есть она говорит, что если points (поинты первого People) меньше, чем a.point (поинты второго People) - вернет true, если обратное - false.

Так же вы можете написать там еще кучу всяких признаков по которым вы считаете, что Первый должен быть меньше Второго.
танкист34
-62 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 328
04.04.2013, 20:29  [ТС]     Массив структур #22
Цитата Сообщение от eocron Посмотреть сообщение
Забудьте про предикаты. Вам они в данный момент, чтобы это понять - не нужны.

Вы можете сортировать как вашей душе угодно. Метод sort выполняет сортировку элементов,только если для них определен оператор больше - [ < ]. (Подумайте сами. Вы же должны как-то сказать сортировке, чем один человек меньше второго? Рост, вес, пол или может быть деньги их различают?)

А вот КАК этот оператор "меньше" определен, как раз и задает та самая:

C++
1
2
3
4
bool operator< (const Person& a) const
{
          return points < a.points;
}
или если вам так будет понятнее:
C++
1
2
3
4
5
6
7
8
9
10
11
bool operator< (const Person& a) const
{
          if(points < a.points)
          {
                return true;
          }
          else
          {
                return false;
          }
}
, что есть то же самое, что и первый код.

То есть она говорит, что если points (поинты первого People) меньше, чем a.point (поинты второго People) - вернет true, если обратное - false.

Так же вы можете написать там еще кучу всяких признаков по которым вы считаете, что Первый должен быть меньше Второго.
Я что-то не понимаю вы пишите забыдь о предикатах, когда я вам написал этот наворот bool operator < (const pixel& a) const { return ver < a.ver; } и тут же пишите, что именно эта штука даёт возможность сравнить. Тавтология какая-то. И опять таки уходим от моего вопроса, я не могу понять что такое const, a, и operator. И почему нельзя применять в моём случае метод пузырька, а писать вот этот наворот который вообще не поддаётся моему пониманию. Всё равно вам спасибо хоть отвечаете, не судите там строго.

Добавлено через 21 минуту
а как функцию сортировки пузырьком применить
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
//////метод пузырька (функция) в качестве параметров массив интов и размерность массива
void bubbleSort(int array[], int colich){                    
        int temp=0;                              
        for (int i=1;  i < colich  ;  i++){            
                for (int j = 0;  j < colich-i;  j++){     
                        if (array [j]>array [j+1]){     
                                temp=array[j];           
                                array [j]=array [j+1];    
                                array [j+1]=temp;
                        }
                }
        }
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2013, 23:20     Массив структур
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
eocron
Кактус
66 / 66 / 6
Регистрация: 23.05.2012
Сообщений: 343
04.04.2013, 23:20     Массив структур #23
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <vector>
 
using namespace std;
 
template<class T>
void bubbleSort(vector<T> &res)
{                
        T temp;                               
        for(int i=0;  i < res.size();  i++)
        {            
                for(int j = 0;  j < res.size()-i;  j++)
                {     
                        if(res[j+1]<res[j])
                        {     
                                temp=res[j];           
                                res[j]=res[j+1];    
                                res[j+1]=temp;
                        }
                }
        }
}
Yandex
Объявления
04.04.2013, 23:20     Массив структур
Ответ Создать тему
Опции темы

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