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

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

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

Author24 — интернет-сервис помощи студентам
Мне нужно пузырьковой сортировкой отсортировать вектор разнородных классов по 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.12.2016, 10:55
Ответы с готовыми решениями:

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

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

Как отсортировать вектор?
было: 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 2
C++
1
std::tie(obj1.a, obj1.b) < std::tie(obj2.a, obj2.b)
0
Эксперт С++
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
28.12.2016, 11:32 3
Лучший ответ Сообщение было отмечено gru74ik как решение

Решение

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

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

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

C++
1
2
if(a>b)
    std::swap(a,b); // поменяли местами
1
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
28.12.2016, 12:39 4
Цитата Сообщение от Demetro4ka Посмотреть сообщение
Мне нужно пузырьковой сортировкой отсортировать вектор разнородных классов по 2 общим полям. Алгоритм сортировки я знаю, вот только не знаю как его применить к классам. Можно ли делать вот так?
Ну, во-первых, эти классы должны иметь общий базовый, а во-вторых, значения разных типов не получится сложить в один массив или вектор, так как у них размеры разные.
Складывайте в вектор указателей на базовый класс.
1
Форумчанин
Эксперт CЭксперт С++
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
28.12.2016, 12:45 5
Определите базовый класс с этими двумя общими полями.
Перегрузите для него оператор сравнения "меньше".
От него отнаследуйте два производных класса.
Создайте вектор указателей на базовый класс.
Отсортируйте его любым способом. Можно использовать готовый вариант с std::sort, можно использовать пузырьковую сортировку, но её реализация ничем не будет отличаться от сортировки обычного массива типа int.
1
2 / 2 / 1
Регистрация: 12.10.2013
Сообщений: 246
29.12.2016, 09:58  [ТС] 6
Цитата Сообщение от 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
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
29.12.2016, 10:01 7
Mr.X,
Цитата Сообщение от Mr.X Посмотреть сообщение
значения разных типов не получится сложить в один массив или вектор, так как у них размеры разные.
А как же tuple?
0
90 / 88 / 33
Регистрация: 20.07.2016
Сообщений: 403
29.12.2016, 10:06 8
Цитата Сообщение от Bretbas Посмотреть сообщение
А как же tuple?
а что tuple? tuple никакого отношения к массивам и векторам не имеет... tuple можно считать обычной структурой.
1
Форумчанин
Эксперт CЭксперт С++
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
29.12.2016, 12:26 9
Пример складывания указателей на базовый класс в вектор. Я умышленно сделал базовый класс абстрактным чтобы показать, что создаются только экземпляры производных классов.
Использовал 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  [ТС] 10
Цитата Сообщение от MrGluck Посмотреть сообщение
using ptr_Transport = std::shared_ptr<Transport>;
ошибку здесь выдает
0
Любитель чаепитий
3744 / 1800 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
30.12.2016, 10:32 11
Цитата Сообщение от Demetro4ka Посмотреть сообщение
ошибку здесь выдает
c++11 не включен значит.
1
Модератор
Эксперт CЭксперт С++
5286 / 2373 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
30.12.2016, 13:22 12
Demetro4ka, тынц.
0
279 / 39 / 13
Регистрация: 11.10.2015
Сообщений: 405
12.06.2017, 00:34 13
rikimaru2013, тут хватит и std::make_pair, std::tie для 3-х и более объектов
1
Неэпический
18106 / 10693 / 2062
Регистрация: 27.09.2012
Сообщений: 26,918
Записей в блоге: 1
12.06.2017, 07:40 14
zarko97, std::tie даст кортеж ссылок, а std::make_pair - пару с копиями объектов, если дополнительно не шаманить.
То есть, используя std::tie мы устраняем копирование объектов.
2
279 / 39 / 13
Регистрация: 11.10.2015
Сообщений: 405
12.06.2017, 13:16 15
Croessmah, тогда собственно придется std::ref/std::cref навешать
0
Неэпический
18106 / 10693 / 2062
Регистрация: 27.09.2012
Сообщений: 26,918
Записей в блоге: 1
12.06.2017, 14:05 16
zarko97, на std::tie не надо.
0
279 / 39 / 13
Регистрация: 11.10.2015
Сообщений: 405
12.06.2017, 15:03 17
Croessmah, я про пэйр
0
12.06.2017, 15:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.06.2017, 15:03
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru