Другие языки программирования и технологии

Сортировка вектора обьектов класса по 1 из аттрибутов.

После многих часов неудач надеюсь что здесь помогут)
Как сортировать массивы или векторы с 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?
Vova Melnik
Vova Melnik
3 431
#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;
}
СА
Саяхат Ахметжанов
54 291
Лучший ответ
Vova Melnik ааааа, вы в своем репертуаре хДДД спасибо)) Но я тоже уже все таки добилась результата через:
class cmp {
public:
bool operator() (const Ticket &a, const Ticket &b) {
return a.priority < b.priority;
}
} myCompare;
main...
sort(vTicket.begin(), vTicket.end(), myCompare);

вот, осталось только разобраться, что делает именно оператор (), т. к. мы этого еще не проходили и проф точно будет валить на этом))
Сортировать - точно так же, как массив примитивов, просто операцию сравнения надо уточнить. Покажи код, которым сортируешь, подскажу, что поправить.
Евгений Хазов
Евгений Хазов
78 455
Vova Melnik Спасибо, но я справилась))