Sortowanie listy obiektów.

0

Poniżej przedstawiam mój program w którym z pomocą internetu udało mi się stworzyć (tzn tego na czerwono nie rozumiem, przyznaję bez bicia). Chcę teraz tę listę posortować malejąco po wsk, ale nie wiem jak to zrobić. Siedzę już nad tym tyle czasu że już mi się miesza. Byłbym bardzo wdzięczny za pomoc.

#include "stdafx.h"
#include <list>
#include <iostream>
using namespace std;

class Element
{
public:
float wsp; //wsp -> współczynnik ilorazu ceny do wagi
int nr;
	Element(int nr, float wsp)
	{
		this->nr=nr;
		this->wsp=wsp;
	}
};



float POLICZ_WSP(float &cena, float &waga)
{
	return cena/waga;
}
int main()
{
  int licznik=0, plecak=0;
  char flag;
  float cena=0, waga=0, wsp=0;

  list <Element> Lista;


	  cout<<"Podaj pojemnosc (wage) plecaka."<<endl;
	  cin>>plecak;
	  for (int i=0; i<80; i++)					// rysowanie linii na całą dł.
		  putchar('*');							// okienka dla przejrzystości 
	putchar('\n');								// programu
	  do
  {
	licznik++;
	cout<<"Element nr: "<<licznik<<endl;
	cout<<"Podaj wartosc (cene) elementu."<<endl;
	cin>>cena;
		while (cena<=0)															//Weryfikacja podanej wartosci
		{
		cout<<"Wpisana wartosc jest niepoprawna, sproboj ponownie."<<endl;
		cin>>cena;
		}
	cout<<"Podaj pojemnosc (wage) elementu."<<endl;
	cin>>waga;
		while (waga<=0)															//Weryfikacja podanej wartosci
		{
		cout<<"Wpisana wartosc jest niepoprawna, sproboj ponownie."<<endl;
		cin>>waga;
		}
		Element *f;
		Lista.push_back(*(f=new Element(licznik, wsp)));
		
		cout<<"Aby dodac kolejny element wcisnij \"t\""<<endl;
		cin>>flag;
  }
  while(flag=='t' || flag=='T');

  system("pause");
  return 0;
}

Element f;
Lista.push_back(
(f=new Element(licznik, wsp)));

tego fragmentu nie rozumiem.

0

Dodajesz do listy nowy Element, którego adres masz zapisany w zmiennej f.

0

No tak, tylko dlaczego nie mogę się odwołać bezpośrednio? No i jak mam się z listy odwołać do wsp należącego do Element? Tzn, jak posortować moją listę po wsp?

0

w przypadku listy wskazników do elementu mogłbyś robić tak:
Lista.push_back(new Element(licznik, wsp)));

w przypadku listy obiektów elementu mogłbyś robić tak(twój przykład) :
Element f(licznik,wsp);
Lista.push_back(f);

Gdybyś miał wektor (std::vector) odwołujesz się do swoich elementów jak w przypadku tablicy, czyli:
Lista[i].wsp (ponieważ cała klasa jest publiczna możesz tak zrobić)
W przypadku listy są tam jakieś metody typu pop ?

Następnie musisz wybrać sposób sortowania oraz go zaimplementować :)
( Całość pisana z ręki, ale chyba nie ma błędów :P )

0

Może zmień zapis
Element f;
Lista.push_back(
(f=new Element(licznik, wsp)));

bo w ten sposób twój program ma wycieki pamięci. Nie jest to problem w tak prostym programie, ale warto być świadomym. Masz dwie mozliwości:

  1. zostawić list <Element> Lista; i dodawac do niej elementy w ten sposób:
    Lista.push_back(Element(licznik, wsp));

  2. zamienić "list <Element> Lista" na "list <Element*> Lista" i dodawać elementy tak:
    Lista.push_back(new Element(licznik, wsp));

ale wtedy pamiętaj, żeby zwolnić pamięć przed usunięciem elementu z listy, np.:
Element* elem = Lista.front();
Lista.pop_front();
delete elem;

0

Ale ja dodawanie obiektów mam już zrobione. Nie mam natomiast pojęcia, jak posortować tą tablice po wsk. Chciałbym coś takiego np:

void insertionSort(int arr[], int length) {
int i, j, tmp;
for (i = 1; i < length; i++) {
j = i;
while (j > 0 && arr[j - 1] > arr[j]) {
tmp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = tmp;
j--;
}
}
}

Tylko nie wiem co powinno być zamiast int arr[], żeby to działało :(

1 użytkowników online, w tym zalogowanych: 0, gości: 1