После многих часов неудач надеюсь что здесь помогут)
Как сортировать массивы или векторы с 1 типом данных я знаю, но вот тут загвоздочка.
Пусть у меня есть
Class Ticket {
Private:
string owner;
string description;
int priority;
}
и следующий class
Class PriorityQueue {
public:
vectro vTickets;
}
в мэине сделала функцию для добавления нового тикета в этот вектор
void newTicket(vector& vTicket) {
string text, owner;
int prior;
cout << "Enter Description: " << endl;
cin >> text;
cout << "Enter owner name: " << endl;
cin >> owner;
cout << "enter priority: " << endl;
cin >> prior;
vTicket.push_back(Ticket(text, owner, prior));
}
Но вот осталась такая задача, после каждого добавления обьекта в вектор, надо его сортировать по аттрибуту приоритета. Сколько не копалась в интернете, всегда вылазиет куча ошибок и никак не могу настроить, подскажите как лучше всего в моем случае отсортировать vTickets?
Другие языки программирования и технологии
Сортировка вектора обьектов класса по 1 из аттрибутов.
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
class ticket {
public:
ticket(string _owner, string _description, int _priority);
static bool compare(const ticket& a, const ticket& b);
private:
ticket() {}
friend ostream& operator<<(ostream& out, const ticket& obj);
string owner;
string description;
int priority;
};
class passenger {
public:
void input();
void output();
private:
int input_int(const string& msg);
vector<ticket> tickets;
};
void add(passenger& passengers, const int quantity);
int main() {
passenger passengers;
int quantity;
while (true) {
cout << "\nQuantity: ";
cin >> quantity;
add(passengers, quantity);
cout << endl;
passengers.output();
}
}
void add(passenger& passengers, const int quantity) {
for (auto i = 0; i < quantity; ++i) passengers.input();
}
ticket::ticket(string _owner, string _description, int _priority)
: owner(_owner), description(_description), priority(_priority)
{
}
bool ticket::compare(const ticket& a, const ticket& b) {
return
a.priority < b.priority ||
a.priority <= b.priority && a.owner < b.owner ||
a.priority <= b.priority && a.owner <= b.owner && a.description < b.description;
}
void passenger::output() {
sort(tickets.begin(), tickets.end(), ticket::compare);
for (auto &t : tickets) cout << t << '\n';
}
void passenger::input() {
string description;
string owner;
int priority;
cin.sync();
cout << "\nEnter Description: ";
getline(cin, description);
cout << "Enter owner name: ";
getline(cin, owner);
priority = input_int("Enter priority: ");
ticket tmp(owner, description, priority);
tickets.push_back(tmp);
}
int passenger::input_int(const string& msg) {
int i;
do {
cout << msg;
cin >> i;
if (cin.good()) return i;
else {
cin.clear();
cin.ignore(cin.rdbuf()->in_avail());
cout << "\a Error!\n";
}
} while (true);
}
ostream& operator<<(ostream& out, const ticket& obj) {
out << obj.owner << " " << obj.priority << " " << obj.description;
return out;
}
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
class ticket {
public:
ticket(string _owner, string _description, int _priority);
static bool compare(const ticket& a, const ticket& b);
private:
ticket() {}
friend ostream& operator<<(ostream& out, const ticket& obj);
string owner;
string description;
int priority;
};
class passenger {
public:
void input();
void output();
private:
int input_int(const string& msg);
vector<ticket> tickets;
};
void add(passenger& passengers, const int quantity);
int main() {
passenger passengers;
int quantity;
while (true) {
cout << "\nQuantity: ";
cin >> quantity;
add(passengers, quantity);
cout << endl;
passengers.output();
}
}
void add(passenger& passengers, const int quantity) {
for (auto i = 0; i < quantity; ++i) passengers.input();
}
ticket::ticket(string _owner, string _description, int _priority)
: owner(_owner), description(_description), priority(_priority)
{
}
bool ticket::compare(const ticket& a, const ticket& b) {
return
a.priority < b.priority ||
a.priority <= b.priority && a.owner < b.owner ||
a.priority <= b.priority && a.owner <= b.owner && a.description < b.description;
}
void passenger::output() {
sort(tickets.begin(), tickets.end(), ticket::compare);
for (auto &t : tickets) cout << t << '\n';
}
void passenger::input() {
string description;
string owner;
int priority;
cin.sync();
cout << "\nEnter Description: ";
getline(cin, description);
cout << "Enter owner name: ";
getline(cin, owner);
priority = input_int("Enter priority: ");
ticket tmp(owner, description, priority);
tickets.push_back(tmp);
}
int passenger::input_int(const string& msg) {
int i;
do {
cout << msg;
cin >> i;
if (cin.good()) return i;
else {
cin.clear();
cin.ignore(cin.rdbuf()->in_avail());
cout << "\a Error!\n";
}
} while (true);
}
ostream& operator<<(ostream& out, const ticket& obj) {
out << obj.owner << " " << obj.priority << " " << obj.description;
return out;
}
Сортировать - точно так же, как массив примитивов, просто операцию сравнения надо уточнить. Покажи код, которым сортируешь, подскажу, что поправить.
Vova Melnik
Спасибо, но я справилась))
Похожие вопросы
- C++ Сортировка в сортировке вектора экземпляров структуры
- 3дмакс как разбить обьект. сделал ландшафт 1 обьектом (очень большой) как текстурироватЬ? или как разбить его на части
- Что такое вектор и что должен содержать класс вектора? (С++)
- Изучил несколько простых алгоритмов сортировки, осталось изучить быструю и слияние, нужно ли вообще писать эти алгоритмы
- Сортировки, язык Си.
- Алгоритмы стандартной библиотеки шаблонов. Вектора в C++.
- Сортировка простыми вставками.
- Проблема с алгоритмом быстрой сортировкой С++
- Работа с математическими векторами в программировании (Основы)
- Как написать макрос для Word 2003 чтобы выполнял сортировку чисел в квадратных скобках?
class cmp {
public:
bool operator() (const Ticket &a, const Ticket &b) {
return a.priority < b.priority;
}
} myCompare;
main...
sort(vTicket.begin(), vTicket.end(), myCompare);
вот, осталось только разобраться, что делает именно оператор (), т. к. мы этого еще не проходили и проф точно будет валить на этом))