Sortowanie mapy | nie działający kod

0

Witam, 2 sprawy. Ponoć mapa ma trochę wspólnego z kolejką priorytetową i nie trzeba jej sortować. Jak w takim razie wybrać największy element z np. takiej mapy

map <string, int> cos; //wybieramy rosnaco wg inta

I druga sprawa, dostałem ten kod w prezencie ale wywala dziwne błędy
http://ideone.com/wNi1r#ul_inouterr
Nie korzystałem nigdy z podobnych rzeczy i nie wiem co to może oznaczać

error: invalid use of inclomplete type 'const struct X'
error: forward declaration of 'const struct X'
0

Musisz wpisać zawartość mapy do std::vector (będą to elementy typu std::pair<std::string, int> a następnie posortować. Potrzebny też będzie własny funktor/funkcja porównująca dla tej pary.

std::map nie ma nic wspólnego z kolejką priorytetową. Mapa jest sortowana wg. kluczy za pomocą komparatora jaki podasz, domyślnie jest to std::less.

0

Jeżeli musisz szukać największego elementu to może mapa to zły wybór.

0

Chciałem to zrobić na kolejce priorytetowej ale musiałbym tam umieścić parę <wskaźnik na coś, float> i sortować po tym float. But how? Można po prostu priority_queue<wsk*, float> ? Potem .top'em ściągać?

0

No i co to za problem taka para? Od tego masz std::pair. Dopisujesz też komparator i już kolejka działa. Pomyśl. Masz przykład bez pary, dopisz tam parę - to wszystko jest analogiczne, tylko typy się zmieniają.

0

A spoko o tym pair zapomniałem. To jeszcze ostatnie pytanie: co oznacza ten błąd

main.cpp: In member function ‘bool XComparator::operator()(const Wierzcholek*, const Wierzcholek*)’:
main.cpp:27:15: error: invalid use of incomplete type ‘const struct Wierzcholek’
main.cpp:13:7: error: forward declaration of ‘const struct Wierzcholek’
main.cpp:27:34: error: invalid use of incomplete type ‘const struct Wierzcholek’
main.cpp:13:7: error: forward declaration of ‘const struct Wierzcholek’
//klasa XComparator
class XComparator {
public:
 
  bool operator()(const Wierzcholek *x1, const Wierzcholek *x2) {
    return (x1->odleglosc_AB > x2->odleglosc_AB);
  }
};


//metoda w innej klasie
	void odleglosc_AB(Wierzcholek * A, Wierzcholek * B)
	{		
		priority_queue<Wierzcholek*, vector<Wierzcholek*>, XComparator> odleglosci_kolejka;
		vector <Wierzcholek*> nieprzebadane = this->tablica_wierzcholkow;
		vector <Wierzcholek*> sasiedzi;
		Wierzcholek * aktualny = A;
		Wierzcholek * koncowy = B;
		long INF = (long)pow(2.0, (8 * sizeof(long int) - 1));
		int sciezka;
		
		for(int i=0; i<nieprzebadane.size(); i++)
		{
			if(nieprzebadane[i] == aktualny) 
			{
				nieprzebadane[i]->odleglosc_AB = 0;
				odleglosci_kolejka.push(nieprzebadane[i]);
			}
			else 
			{
				nieprzebadane[i]->odleglosc_AB = INF;
				odleglosci_kolejka.push(nieprzebadane[i]);
			}
		}

		while(nieprzebadane.size() > 0 && aktualny != NULL)
		{
			nieprzebadane.erase(nieprzebadane.begin()+znajdz_pozycje(nieprzebadane, aktualny));	
			
			sasiedzi = this->pobierz_sasiadow(aktualny);
			
			for(int i=0; i<sasiedzi.size(); i++)
			{
				sciezka = aktualny->odleglosc_AB + this->pobierz_dlugosc_krawedzi(aktualny, sasiedzi[i]);
				if(sciezka < aktualny->odleglosc_AB)
					aktualny->odleglosc_AB = sciezka; 
			}
			
			if(nieprzebadane.size() > 0) 
				aktualny = odleglosci_kolejka.top(); 
			
		}
	
		cout<<koncowy->identyfikator<<endl;
		
		this->odleglosc = aktualny->odleglosc_AB;
	}	
1

To znaczy tyle, że nie wiadomo co to jest Wierzcholek. Kompilator mówi, że ma tylko deklarację zapowiadającą a Ty próbujesz używać jakichś składowych tego typu, które nie są znane. Może brakuje Ci pliku nagłówkowego?

I zmień nazwę tego komparatora. Teraz to jest WierzcholekComparator.

0

Nie brakuje. W linku w pierwszym poście jest ten skrypt z którego korzystam. To jest to samo tylko zmieniłem X na WIerzcholek.

//reszta includow
#include <queue>

using namespace std;

class Krawedz;
class Wierzcholek;
class Graf;
class XComparator;

#include "functions/functions.h"
#include "classes/class.loader.h"


class XComparator {
public:
 
  bool operator()(const Wierzcholek *x1, const Wierzcholek *x2) {
    return (x1->odleglosc_AB > x2->odleglosc_AB);
  }
};

class Wierzcholek
{
  public:
	int identyfikator;
	float odleglosc_AB;
	
	Wierzcholek(int identyfikator)
	{
		this->identyfikator = identyfikator;
	}
};
//reszta klas w tym klasa z metodą z poprzedniego posta.
1

Przestaw ten XComparator poniżej definicji werzcholka.
W XComparator odwołujesz się do składowej wierzchołka, a kompilator jeszcze nie wie o istnieniu takiej składowej.

0

Faktycznie! Dziwne, skoro zdefiniowałem te klasy wcześniej powinno być OK.

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