[C++] wskaźniki oraz stringi w funkcjach (kodowanie huffmana)
Ostatnio zmodyfikowano 2014-07-01 15:43
Monika90 |
» 2014-06-30 15:11:44 @Kinga priority_queue < element > kolejka;
tak nie może być, musisz użyć kolejki wskaźników: std::priority_queue < element *, std::vector < element *>, porownanie > kolejka;
ale zanim to zrobisz, to musisz zdefiniować funktor porównujący częstości wystąpienia znaków struct porownanie { bool operator ()( const element * e1, const element * e2 ) const { return e1->key < e2->key; } };
w tej pętli też uzyj new for( int i = 0; i < ileznakow; ++i ) { cin >> znak >> jakczesto; el1 = element( znak, - jakczesto ); kolejka.push( el1 ); }
NULL? Nieeeeeeeeeeeeeeeee!!!!!!!!!!11111!!!!!! |
|
kinga9650 Temat założony przez niniejszego użytkownika |
» 2014-06-30 22:46:22 @michal11, czyli... primo - jeśli tu by był konstruktor to powstałby nowy obiekt, ale to konstruktor nie jest + w takim razie czym są poniższe linijki w kodzie? element( char a, int k ) : key( k ) , znak( a ) , left( NULL ) , right( NULL ) { }; element() { }; secundo - czyli jeśli tworzę własną klasę muszę opisać każdą wykonywaną operację, przypisać znaczenie każdemu operatorowi, tak? tercero - to co w takim razie ta linijka robi teraz, skoro nie to co myślę? ;) @Moinka a czemuż to nie może być 'zwykła' kolejka? Nawet przeciążenie operatora porównywania ani nic w tym style nic tu nie zdziała? Ale na pewno nie potraktuje to takiego 'NULL' jako 0? Takie rozwiązanie, jak jest w ym momencie jest 'niebezpieczne', czyt. może mi np. wrzucić do tej zmiennej obojętnie co? |
|
pekfos |
» 2014-06-30 23:10:18 Ale na pewno nie potraktuje to takiego 'NULL' jako 0? Takie rozwiązanie, jak jest w ym momencie jest 'niebezpieczne', czyt. może mi np. wrzucić do tej zmiennej obojętnie co? |
Powinno być tam zero.. ale NULL jest niemodne i w ogóle 'be'. Teraz w C++ używa się nullptr. |
|
michal11 |
» 2014-07-01 12:41:57 Nie, to jest konstruktor i to w dodatku wywoływany jawnie. Tworzy on nowe obiekty przypisywane w każdym obiegu pętli do tej samej nazwy, inna sprawa, że za każdym razem przyjmuje takie same argumenty, czyli robisz ileś takich samych obiektów. Nie musisz robić wszystkich operatorów, tylko te z których korzystasz. Akurat w twoim przypadku może działać tak jak myślisz, ale jeżeli w klasie są wskaźniki to lepiej samemu zdefiniować sobie konstruktor kopiujący i operator=. |
|
Monika90 |
» 2014-07-01 15:43:15 @Monika a czemuż to nie może być 'zwykła' kolejka? Nawet przeciążenie operatora porównywania ani nic w tym style nic tu nie zdziała? |
To może być zwykła kolejka, dla mnie kolejka wskaźników jest tutaj bardziej naturalna, ale zrób jak chcesz. Ale na pewno nie potraktuje to takiego 'NULL' jako 0? Takie rozwiązanie, jak jest w ym momencie jest 'niebezpieczne', czyt. może mi np. wrzucić do tej zmiennej obojętnie co? |
NULL jest dla wskaźników, znak to nie jest wskaźnik. Znak o kodzie zero to '\0'. Użycie NULL sugeruje czytającemu kod, że zmienna znak jest typu wskaźnikowego, a przecież nie jest, więc to jest oszukiwanie czytelnika. |
|
1 2 « 3 » |