Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
2 / 2 / 1
Регистрация: 12.10.2013
Сообщений: 246

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

28.12.2016, 10:55. Показов 2855. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне нужно пузырьковой сортировкой отсортировать вектор разнородных классов по 2 общим полям. Алгоритм сортировки я знаю, вот только не знаю как его применить к классам. Можно ли делать вот так?
C++
1
2
for (i=0;i<mas.size()-2;i++){
if (mas[i].pole>mas[i+1.pole)] { buff = mas[i]; mas[i] = mas[i+1]; mas[i+1] = buf}}
То есть целиком класс переносить в векторе?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.12.2016, 10:55
Ответы с готовыми решениями:

Отсортировать вектор классов
есть вектор с полями mas.group и mas.zad первый тип строковый, второй int, короче нужно в векторе по полю &quot;групп&quot;...

Как заполнить вектор на вектор классов
#include &lt;iostream&gt; #include &lt;vector&gt; class Num { private: int m_num; public: Num(int num) { num =...

Как отсортировать вектор?
было: 1 2 3 0 5 7 0 5 1 стало: 0 5 1 0 5 7 1 2 3

16
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
28.12.2016, 11:01
C++
1
std::tie(obj1.a, obj1.b) < std::tie(obj2.a, obj2.b)
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
28.12.2016, 11:32
Лучший ответ Сообщение было отмечено gru74ik как решение

Решение

Цитата Сообщение от Demetro4ka Посмотреть сообщение
Можно ли делать вот так?
нельзя.

определите в классе оператор сравнения, и оператор присваивания

потом можно будет сделать:

C++
1
2
if(a>b)
    std::swap(a,b); // поменяли местами
1
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
28.12.2016, 12:39
Цитата Сообщение от Demetro4ka Посмотреть сообщение
Мне нужно пузырьковой сортировкой отсортировать вектор разнородных классов по 2 общим полям. Алгоритм сортировки я знаю, вот только не знаю как его применить к классам. Можно ли делать вот так?
Ну, во-первых, эти классы должны иметь общий базовый, а во-вторых, значения разных типов не получится сложить в один массив или вектор, так как у них размеры разные.
Складывайте в вектор указателей на базовый класс.
1
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
28.12.2016, 12:45
Определите базовый класс с этими двумя общими полями.
Перегрузите для него оператор сравнения "меньше".
От него отнаследуйте два производных класса.
Создайте вектор указателей на базовый класс.
Отсортируйте его любым способом. Можно использовать готовый вариант с std::sort, можно использовать пузырьковую сортировку, но её реализация ничем не будет отличаться от сортировки обычного массива типа int.
1
2 / 2 / 1
Регистрация: 12.10.2013
Сообщений: 246
29.12.2016, 09:58  [ТС]
Цитата Сообщение от Mr.X Посмотреть сообщение
Складывайте в вектор указателей на базовый класс.
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
#include <iostream>
#include <stdlib.h> //Для очистки экрана
#include <fstream> //Для работы с файловыми потоками
#include <vector> //для работы с векторами
#include <clocale> //для кодировки
#include <cstring> //для работы со строками
#include <algorithm>
#include <windows.h>
 
 
using namespace std;
class Transport{
  public:
  int speed;
  int distance;
  Transport(int _speed = 0, int _distance = 0):speed(_speed), distance(_distance){};
};
 
class aircraftes: public Transport{
 public:
  int range; //дальность
  int carrying;  //грузоподъемность
  //конструктор класса по умолчанию
 aircraftes(int _range = 0,int _carrying = 0) : range(_range),  carrying(_carrying) {};
};
 
 
 class trains: public Transport{
 public:
     int carruage; //вагонов
      trains( int _carruage = 0) :  carruage(_carruage) {};
 };
 
 class ship: public Transport{
 public:
     int displacement;
     enum {yacht=1, boat, launch} vessel;
      ship( int _displacement = 0) :  displacement(_displacement) {};
 };
 
struct compareSpeed {
    bool operator()(const Transport& a, const Transport& b) {
 
        return a.speed < b.speed;
  }  };
 
 
int main()
{
   aircraftes A;
   trains B;
   ship C;
   //-----------------
  SetConsoleOutputCP(1251);
  SetConsoleCP(1251);
  vector <Transport> mas; //список  в векторе
  string str; //сстрока текстового файла
  int schetchik = 0;
  int type_transport = 0;
  char massiv[255]; //запись строки в массив для разложения на токены
  char *p; //указатель на первый токен
  char *p1;//на второй
  char *p2;//и т.д.
  char *p3;
  int iteracia = 0 ;
  ifstream file("C:/input.txt"); //чтение из файла
  if (file.is_open()){
        cout<< "файл существует"<<endl;
  while (getline(file, str)) //пока читается построчно
  {
    cout<<str<<endl;
    strcpy(massiv, str.c_str()); //копируем в массив строку
    p = strtok(massiv, " ");//берем первое слово
 
    if ((schetchik == 0) ||(schetchik%2 == 0)) {
     type_transport = atoi(p);
     cout<<"type od transport = "<<type_transport<<endl;
    }
    else {
 
    if (type_transport == 1) {
     p1 = strtok(NULL, " "); //следущее
     p2 = strtok(NULL, " ");//и т.д.
     p3 = strtok(NULL, " ");
     mas.push_back(aircraftes(atoi(p2),atoi(p3)));//записываем в вектор класс
     mas[iteracia].distance = atoi(p);
     mas[iteracia].speed = atoi(p1);
     cout<<"one = "<<p<<endl;
     cout<<"two = "<<atoi(p1)<<endl;
     cout<<"three="<<p2<<endl;
     cout<<"foour"<<p3<<endl;
    }
     if (type_transport == 2) {
     p1 = strtok(NULL, " "); //следущее
     p2 = strtok(NULL, " ");//и т.д.
     mas.push_back(trains(atoi(p2)));//записываем в вектор класс
     cout<<"p2 = "<<p2<<endl;
     cout<< "speed"<<mas[iteracia].speed<<endl;
     cout<< "distance"<<mas[iteracia].distance<<endl;
     mas[iteracia].distance = atoi(p);
     mas[iteracia].speed = atoi(p1);
    // mas[iteracia].speed = 10;
    cout<<"-----------"<<endl;
     cout<< "speed"<<mas[iteracia].speed<<endl;
     cout<< "distance"<<mas[iteracia].distance<<endl;
//   cout<<"range"<<mas[iteracia].range<<endl;
    }
     if (type_transport == 3) {
     p1 = strtok(NULL, " "); //следущее
     p2 = strtok(NULL, " ");//и т.д.
     p3 = strtok(NULL, " ");
     mas.push_back(ship(atoi(p2)));//записываем в вектор класс
     mas[iteracia].distance = atoi(p);
     mas[iteracia].speed = atoi(p1);
 
    }
    iteracia++;
    }
   schetchik++;
}
 
file.close();//закрываем поток
cout<<mas.size()<<endl;
sort(mas.begin(), mas.end(),compareSpeed());//сортировка 
//for(int i = 0; i < mas.size()-1; i++){
// cout<<"hjhg"<<endl;//выводим группы
//}
 
for (int i=0;i<mas.size();i++){
        cout<<mas[i].distance<<" "<<endl;
 }
  }
  else {
    cout<<"Error opening file!"<<endl;
  }
    return 0;
}
Добавлено через 4 минуты
mas.push_back добавляет значения, как просмотреть эти значения?
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
29.12.2016, 10:01
Mr.X,
Цитата Сообщение от Mr.X Посмотреть сообщение
значения разных типов не получится сложить в один массив или вектор, так как у них размеры разные.
А как же tuple?
0
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
29.12.2016, 10:06
Цитата Сообщение от Bretbas Посмотреть сообщение
А как же tuple?
а что tuple? tuple никакого отношения к массивам и векторам не имеет... tuple можно считать обычной структурой.
1
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
29.12.2016, 12:26
Пример складывания указателей на базовый класс в вектор. Я умышленно сделал базовый класс абстрактным чтобы показать, что создаются только экземпляры производных классов.
Использовал smart pointer т.к. RAII и не охота следить за памятью.
Кривые-косые названия поправил, но только те, что сильно в глаза бросались.
У вас почему-то не инициализируются поля базового класса. И везде только конструкторы по умолчанию, но думаю, с этим вы сами справитесь. Я лишь хотел показать как правильно складывать объекты производных классов в один контейнер.
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
#include <algorithm>
#include <iostream>
#include <memory>
#include <vector>
 
class Transport
{
public:
    Transport(int speed = 0, int distance = 0) : m_speed(speed), m_distance(distance) {}
    int getSpeed() const { return m_speed; }
    virtual void print() const = 0; // чисто виртуальная функция
 
protected:
    int m_speed;
    int m_distance;
};
 
class Aircrafts : public Transport
{   
public:
    //конструктор класса по умолчанию
    Aircrafts(int range = 0, int carrying = 0) : m_range(range), m_carrying(carrying) {}
    void print() const override { std::cout << "Aircrafts\n"; }
 
protected:
    int m_range; // дальность
    int m_carrying;  // грузоподъемность
};
 
 
class Trains : public Transport
{
public:
    Trains(int carruage = 0) : m_carruage(carruage) {}
    void print() const override { std::cout << "Trains\n"; }
 
protected:
    int m_carruage; // вагонов
};
 
class Ship : public Transport
{
public:
    Ship(int displacement = 0) : m_displacement(displacement) {}
    void print() const override { std::cout << "Ship\n"; }
 
protected:
    int m_displacement;
    enum { yacht = 1, boat, launch } m_vessel;
};
 
using ptr_Transport = std::shared_ptr<Transport>;
 
struct CompareSpeed
{
    bool operator()(const ptr_Transport &a, const ptr_Transport &b)
    {
        return a->getSpeed() < b->getSpeed();
    }
};
 
int main()
{
    std::vector<ptr_Transport> data = {
        std::make_shared<Aircrafts>(1, 2),
        std::make_shared<Trains>(3),
        std::make_shared<Ship>(4)
    };
    std::sort(data.begin(), data.end(), CompareSpeed());
    for (const auto &p : data)
        p->print();
}
1
2 / 2 / 1
Регистрация: 12.10.2013
Сообщений: 246
30.12.2016, 09:47  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
using ptr_Transport = std::shared_ptr<Transport>;
ошибку здесь выдает
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
30.12.2016, 10:32
Цитата Сообщение от Demetro4ka Посмотреть сообщение
ошибку здесь выдает
c++11 не включен значит.
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
30.12.2016, 13:22
Demetro4ka, тынц.
0
 Аватар для zarko97
279 / 39 / 13
Регистрация: 11.10.2015
Сообщений: 405
12.06.2017, 00:34
rikimaru2013, тут хватит и std::make_pair, std::tie для 3-х и более объектов
1
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
12.06.2017, 07:40
zarko97, std::tie даст кортеж ссылок, а std::make_pair - пару с копиями объектов, если дополнительно не шаманить.
То есть, используя std::tie мы устраняем копирование объектов.
2
 Аватар для zarko97
279 / 39 / 13
Регистрация: 11.10.2015
Сообщений: 405
12.06.2017, 13:16
Croessmah, тогда собственно придется std::ref/std::cref навешать
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
12.06.2017, 14:05
zarko97, на std::tie не надо.
0
 Аватар для zarko97
279 / 39 / 13
Регистрация: 11.10.2015
Сообщений: 405
12.06.2017, 15:03
Croessmah, я про пэйр
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.06.2017, 15:03
Помогаю со студенческими работами здесь

Создать иерархию классов вектор и безопасный вектор с проверкой выхода за пределы
Создать иерархию классов вектор и безопасный вектор с проверкой выхода за пределы. Безопасный вектор определяет переменные нижний и верхний...

Создать иерархию классов вектор(longint) и безопасный вектор с проверкой выхода за пределы
Помогите не знаю как сделать! Создать иерархию классов вектор(longint) и безопасный вектор с проверкой выхода за пределы. Безопасный...

Как в один вектор поместить много классов?
Всем привет. Есть задумка а как сделать пока не ясно. Есть в наличии допустим много классов, в этих классах одинаковые интерфейсы ввода...

Как отсортировать вектор состоящий из элементов struct?
Как отсортировать вектор состоящий из элементов struct? #include &quot;pch.h&quot; #include&lt;iostream&gt; #include&lt;windows.h&gt; ...

Вектор классов. Число конструкторов элементов меньше числа деструкторов. Как так ?
Добрый день. Разбираюсь с stl с++11 в частности с векторами. Имеем простейший код в котором просто заполняем вектор классами контактов: ...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru