Siema. Potrzebuję pomocy. Otóż kod poniżej przedstawia program, którego zadaniem jest wczytanie z pliku wierszy do listy a następnie do kolejki, czyli chodzi tu o kolejkę priorytetową list. Moim poprzednim zadaniem była lista kolejek priorytetowych, dlatego teraz przerabiam na kolejkę. I w sumie nie wiem czy dobrze to robię... Mam kilka problemów.... W " typedef'ach" nie potrafię zastosować predykatów na sortowanie . Zadaniem jest posortowanie najpierw list gdzie wiersz zawiera więcej niż 6 słów alfabetycznie rosnąco w pp malejąco. Później posortowanie kolejki pod względem wielkości list , nie ważne czy malejąco czy rosnąco. Od tego jest predykat mojeGreater2 lecz nie potrafię go użyć. Moje pytanie czy w tym przypadku można użyć predykatów w typedefach? Jeśli tak to jak? W klasie Mikser tworze za pomocą typedefa obiekt. Czy powinienem go tworzyć czy nie muszę? Czy sortowanie jakie używam do sortowania wiersza tak ma wyglądać? No i mam problem z operatorami przeciążonymi strumienia. Pierwszy jest dobry ale nie potrafię napisać wypisywania całej kolejki list. Z góry dzięki za pomoc.
#include <iostream>
#include <list>
#include <queue>
#include <fstream>
#include <string>
#include <set>
#include <sstream>
#include <deque>
#include <vector>
using namespace std;
//Kolejnosc slow w wierszu alfabetycznie
struct mojeGreater {
bool operator()(const string &lv, const string &rv)
{
for (size_t i = 0; i < lv.size(); ++i){
if (lv[i] < rv[i])
return true;
else
return false;
}
}
};
struct mojeGreaterr {
bool operator()(const string &lv, const string &rv)
{
for (size_t i = 0; i < lv.size(); ++i) {
if (lv[i] > rv[i])
return true;
else
return false;
}
}
};
typedef priority_queue<list<string>> kolejkalist;
typedef list<string> lista;
//Kolejnosc list w kolejce
struct mojeGreater2 {
bool operator()(const lista &lv, const lista &rv)
{
if (lv.size() < rv.size())
{
return true;
} //nie potrafie tego uzyc...
else
{
return false;
}
}
};
//Przeciazony operator wypisywania wiersza do strumienia
ostream & operator <<(ostream & strumienWyjscie, lista wiersz) {
strumienWyjscie << wiersz.size() << ": ";
for (lista::iterator start = wiersz.begin(); start != wiersz.end(); start++)
{
strumienWyjscie << *start<<" ";
}
strumienWyjscie << endl;
return strumienWyjscie;
}
//Przeciazony operator wypisywania kolejek listy do strumienia
ostream & operator<<(ostream &strumienWyjscie, kolejkalist kolejka) {
while (!kolejka.empty()) {
strumienWyjscie << kolejka.size() << ": ";
strumienWyjscie << kolejka.top() << " ";
kolejka.pop();
}
return strumienWyjscie;
}
class Mikser : public kolejkalist {
//listaKolejek listaWlasciwa;
kolejkalist kolejkaWlasciwa;
public:
Mikser(){};
Mikser(string fileNameProto){
open(fileNameProto);
}
~Mikser()
{
while (!kolejkaWlasciwa.empty()) {
kolejkaWlasciwa.pop();
}
}
void open(string nazwaPliku) {
//Otwarcie pliku
ifstream plik;
plik.open(nazwaPliku, ios::in);
if (plik.good()) cout << "Otwarto plik." << endl;
else {
cout << "Nie otwarto pliku. Koniec imprezy.";
exit(0);
}
//Pobieranie wierszy do kolejki
string wczytanyWiersz;
while (getline(plik, wczytanyWiersz)) {
//Pomijanie pustych linii
if (wczytanyWiersz == "") continue;
//Ladowanie slow do listy (wiersza)
lista wiersz;
stringstream wierszDoSprawdzenia;
wierszDoSprawdzenia << wczytanyWiersz;
string jedenWyraz;
while (wierszDoSprawdzenia >> jedenWyraz) {
wiersz.push_back(jedenWyraz); //do listy
}
if(wiersz.size()>=6)
wiersz.sort(mojeGreater());
else
wiersz.sort(mojeGreaterr());
//wiersz.sort(mojeGreater2());
kolejkaWlasciwa.push(wiersz); //do kolejki
//cout << wiersz;
}
cout << kolejkaWlasciwa;
};
};
int main()
{
Mikser pierwszy;
pierwszy.open("mistrz.txt");
return 0;
}