Wachtrij van reeks tekens

include 
using namespace std;
char msg[1000];

Nu wil ik een wachtrij hebben die 5 van dit soort berichten kan opslaan. Het is dus een wachtrij van maat 5 die 5 arrays van tekens bevat, elke array kan maximaal 1000 tekens bevatten.

Hoe kan ik de wachtrij initiëren? Ik heb dit geprobeerd maar het werkte niet.

char msg[1000];
queue p;
2
@JoeMcGrath Bedankt. Ik deed deque QUEUE; while (1) {char msg [1000]; msg = newString (); QUEUE.push (msg); } . Toen kwam ik erachter dat al het element in de wachtrij hetzelfde zal zijn, omdat ze verwijzen naar hetzelfde msg . Hoe kan ik het probleem oplossen?
toegevoegd de auteur JJ Liu, de bron
std: string is netjes.
toegevoegd de auteur AusCBloke, de bron
Wat werkte niet? compileerfout?
toegevoegd de auteur Joe McGrath, de bron

4 antwoord

struct msg {
  char data[1000];
};
queue p;
3
toegevoegd
In plaats van een struct te maken, zou je std :: array kunnen gebruiken. Wat eigenlijk hetzelfde doet, maar ook handige functies biedt.
toegevoegd de auteur Benjamin Lindley, de bron
Ik had aanvankelijk typedef char msg [1000]; geschreven, maar zoals Tomalak al zei, dat werkt niet met STL-containers. Het inpakken met een struct herstelt dat, hoewel iets dat std :: string of std :: vector gebruikt, mogelijk efficiënter is, afhankelijk van de aard van de data.
toegevoegd de auteur smparkes, de bron
Bedankt voor de notitie @ BenjaminLindley. Onderdeel van TR1/C ++ 11 Ik was niet op de hoogte.
toegevoegd de auteur smparkes, de bron

msg is an array, not a type. And since arrays are not copyable, this is not going to work anyway. Why not a std::queue instead?

2
toegevoegd
@JJLiu: Waarom? Dat is gek.
toegevoegd de auteur Lightness Races in Orbit, de bron
bedankt voor je suggestie, maar deze keer moest ik char * gebruiken
toegevoegd de auteur JJ Liu, de bron

Edit: std::vector may be better choice, just reread you question and saw the size of the character array. If you are using it to store binary data, a std::queue< std::vector > msgs is probably your best choice.

U kunt een variabele niet als type gebruiken. Je zou echter een rij van personpointers kunnen hebben.

#include 
#include 

std::queue  msgs;

int main()
{
    char one[50]="Hello";
    msgs.push(one);
    char two[50]="World\n\n";
    msgs.push(two);

    msgs.push("This works two even though it is a const character array, you should not modify it when you pop it though.");


    while(!msgs.empty())
    {
        std::cout << msgs.front();
        msgs.pop();
    }

return 1;
}

Je kunt ook gewoon std :: string gebruiken en fouten vermijden. Als u een char * gebruikt, wilt u een functie msgs toe te voegen aan de wachtrij, ze kunnen niet op de stapel staan ​​(dwz u moet ze aanmaken met nieuw of malloc ) dan je zou moeten onthouden om ze te verwijderen tijdens het verwerken van de wachtrij. Er zou geen gemakkelijke manier zijn om te bepalen of iemand zich in de globale ruimte bevindt, één op de stapel staat of één is gemaakt met nieuw. Zou leiden tot ongedefinieerd gedrag of geheugenlekken als het niet correct werd behandeld. std :: string zou al deze problemen vermijden.

#include 
#include 
#include 

std::queue  msgs;

int main()
{

    msgs.push("Hello");
    msgs.push("World");

    while(!msgs.empty())
    {
        std::cout << msgs.front();
        msgs.pop();
    }

return 1;
}

Als het slechts 5 standaardberichten zijn, zou const char * een goede keuze zijn, maar als het altijd dezelfde berichten zijn, moet u een wachtrij van gehele getallen raadplegen die verwijst naar het bericht dat u zoekt. Op deze manier zou je er meer acties aan kunnen koppelen. Maar dan zou je ook een rij objecten kunnen overwegen.

#include 
#include 

std::queue  msgs;

int main()
{

    msgs.push(1);
    msgs.push(2);

    while(!msgs.empty())
    {
        switch(msgs.front())
        {
        case 1:
            std::cout << "Hello";
        break;
        case 2:
            std::cout << "World";
        break;
        default:
            std::cout << "Unkown Message";
        }

        msgs.pop();
    }

    return 1;
}
2
toegevoegd
hartelijk bedankt! het werkt
toegevoegd de auteur JJ Liu, de bron
Bedankt. Ik deed deque QUEUE; while (1) {char msg [1000]; msg = newString (); QUEUE.push (msg); } . Toen kwam ik erachter dat al het element in de wachtrij hetzelfde zal zijn, omdat ze verwijzen naar hetzelfde msg . Hoe kan ik het probleem oplossen?
toegevoegd de auteur JJ Liu, de bron
Ja. ik heb het uitgezocht. newString() symboliseert een functie die de vaule van de msg verandert. Ik heb in plaats daarvan char * msg = new char [1000]; gebruikt en nu werkt het
toegevoegd de auteur JJ Liu, de bron
Ik weet niet zeker wat newString() is, maar ik denk dat msg mij gewoon een char * in dit geval zou moeten noemen ... kun je posten wat newString doet in je vraag?
toegevoegd de auteur Joe McGrath, de bron

Allereerst heeft u een '#' - teken nodig voor uw include-statement.

Ten tweede, als u wachtrijen declareert, plaatst u het gewenste type in de punthaken (in uw geval 'char *'), geen variabelenaam zoals 'msg'.

0
toegevoegd
@ AlfP.Steinbach: Ik ben het in principe eens, maar het is niet jouw taak om het stemrecht van iemand anders "te annuleren". Is dit echt een "geweldig" antwoord dat een upvote waardig is?
toegevoegd de auteur Lightness Races in Orbit, de bron
bedankt, het antwoord is goed
toegevoegd de auteur JJ Liu, de bron
+1 om anonieme downvoter te bestrijden. er is niets mis in dit antwoord, voor zover ik kan zien.
toegevoegd de auteur Cheers and hth. - Alf, de bron
@ TomalakGeret'kal: sinds wanneer kreeg je de indruk dat je beslist wat andere SO-lezers wel en niet kunnen doen? Hoe dan ook, ik denk dat zelfs jij begrijpt dat dit het stemrecht van iemand anders niet annuleert. het annuleert zuiver destructief werk
toegevoegd de auteur Cheers and hth. - Alf, de bron