Struktury, stosy i kolejki

Odpowiedz Nowy wątek
2019-05-14 19:33
0

Witam, mam zadanie w którym z pliku binarnego struktura zawodnik w którym jest pole imię i nazwisko pobrać dane i zapisać do pliku tekstowego pary nazwisk ( pierwszy z ostatnim , drugi z przedostatnim itd ) używając stosu i kolejki. Wytłumaczy ktoś jak to zrobić?

Pozostało 580 znaków

2019-05-14 19:51
0

Po co Ci stos i kolejka, kolejka wystarczy(dokładniej Double Ended Queue, dalej DEQ). W DEQ, dokładanie i ściąganie elementów, z końca i początku są O(1).
http://www.cplusplus.com/reference/deque/deque/


edytowany 2x, ostatnio: lion137, 2019-05-14 20:45
Mówisz o kolejce, a linkujesz do deque - enedil 2019-05-14 20:36
Deque, to chyba kolejka. - lion137 2019-05-14 20:43
Queue to kolejka, deque to "double ended queue" czyli właśnie kolejka z dostępem do obu końców. - enedil 2019-05-14 20:44
No tak, zedytowałem post. - lion137 2019-05-14 20:46
Korzystając z DEQ nie zaliczy mi zadania - Piotr cezary 2019-05-14 22:07

Pozostało 580 znaków

2019-05-14 21:34
0

Posługując się podwójną kolejką można korzystać ze struktur czy tylko z klasy? Trochę poczytałem o kolejkach i tak oto powstał początek kodu.

#include <iostream>
#include <fstream>
#include <string>
#include <queue>

using namespace std;

#pragma pack(push, 1)
struct player
{
    string name;
    string surname;
};
#pragma pack(pop)

queue <player> quequeplayer;
int main()
{

    ifstream ifs("plik.bin", ios::binary);
    char* temp = new char[sizeof(player)]; // tymczasowy bufor na dane
    ifs.read(temp, sizeof(player)); // wczytujemy dane do bufora
    player* file = (player*)(temp); // rzutujemy zawartość bufora na typ File

    cout << file->name <<  " " << file->surname << endl;
    delete file;
}

Początek już mam, teraz jak zrobić aby zapisać do pliku tekstowego pary nazwisk tj jest w zadaniu?

edytowany 2x, ostatnio: Piotr cezary, 2019-05-14 22:14

Pozostało 580 znaków

2019-05-14 22:41
0

To nie zadziała.
std::string to coś innego niż char*.
sizeof(std::string) nie pokaże Ci wielkości (długości) ciągu. W większości przypadków będzie różny od wartości std::string::length(), której oczekujesz.
Musisz to rozwiązać inaczej.
Zapisując dodawaj długość ciągu na początku lub odczytuj do znaku '\0'.

Jak robisz new[] to zwalnianie też musi być z nawiasami (delete[]).

edytowany 2x, ostatnio: Delor, 2019-05-15 08:55
Najprawdopodobniej nie będzie równy sizeof(void*). Bądź co bądź, poza wskaźnikiem na dane, będzie tam co najmniej trzymany rozmiar stringa. U mnie na maszynie, rozmiar ten to 32 (a rozmiar void* to 8). - enedil 2019-05-15 00:17
To jest zależne od implementacji. Te dane mogą być w dynamicznie przydzielanym fragmencie pamięci. https://onlinegdb.com/SJbXDT_nV - Delor 2019-05-15 00:57
No, nie powiedziałem, że są jakieś gwarancje na temat tego, jakie to będzie duże. Ty mi zarzucasz kompilator online, to ja mogę Tobie zarzucić lepszą wersję - https://godbolt.org/z/HyyjMG. Jak poprzeskakujesz po różnych kompilatorach, to zauważysz że na GCC x86-64, sizeof(std::string) == 8 o ile wersja GCC < 5. U mnie na komputerze jest 8.3. Poza tym, są różne dziwne kompilatory i różne dziwne platformy gdzie istotnie te rozmiary są równe, ale zazwyczaj jednak tak nie jest (bo na x86-{64,32} i na każdej wersji clanga i MSVC te rozmiary są różne). - enedil 2019-05-15 02:49
Optowałbym jednak za stwierdzeniem, że bardziej prawdopodobne, że te rozmiary są różne. - enedil 2019-05-15 02:50
Poprawione. - Delor 2019-05-15 07:41

Pozostało 580 znaków

2019-05-15 12:57
0

Używając tylko kolejki i stosu można napisać następujący algorytm ( zakładam że liczba nazwisk jest parzysta ):

#include <iostream>
#include <stack>
#include <queue>
#include <vector>

using namespace std;

int main()
{
    vector<string> names = { "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8" };
    vector<pair<string,string>> namePairs;

    queue<string> queueNames; // FIFO
    stack<string> stackNames; // LIFO

    for( const auto& name : names )
    {
        queueNames.push(name);
        stackNames.push(name);
    }

    for( auto i=0 ; i<names.size()/2 ; ++i )
    {
        namePairs.push_back( { queueNames.front() , stackNames.top() } );
        queueNames.pop();
        stackNames.pop();
    }

    for( const auto& [back,front] : namePairs )
    {
        cout << back << " " << front << "\n";
    }

    return 0;
}

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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