Очередь массива символов - PullRequest
       13

Очередь массива символов

2 голосов
/ 07 декабря 2011
include <queue>
using namespace std;
char msg[1000];

Теперь я хочу иметь очередь, которая может хранить 5 сообщений такого типа.Таким образом, это очередь размером 5, содержащая 5 массивов символов, каждый массив может содержать до 1000 символов.

Как мне инициировать очередь?Я попробовал это, но это не сработало.

char msg[1000];
queue<msg> p;

Ответы [ 4 ]

3 голосов
/ 07 декабря 2011
struct msg {
  char data[1000];
};
queue<msg> p;
2 голосов
/ 07 декабря 2011

Edit: std :: vector может быть лучшим выбором, просто перечитайте ваш вопрос и посмотрите размер массива символов.Если вы используете его для хранения двоичных данных, std::queue< std::vector <char> > msgs, вероятно, ваш лучший выбор.

Нельзя использовать переменную в качестве типа.Вы можете иметь очередь указателей персонажей, хотя.

#include <iostream>
#include <queue>

std::queue <char*> 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;
}

Вы также можете просто использовать std :: string и избежать ошибок.Если вы используете char*, вы хотите, чтобы функция добавляла сообщения в очередь, они не могут быть в стеке (т. Е. Вам нужно было бы создать их с new или malloc), чем вы должны были бы помнить, чтобы удалить их приВы обработали очередь.Не было бы простого способа определить, находится ли кто-то в глобальном пространстве, находится ли он в стеке, или был сделан с новым.При неправильном обращении может привести к неопределенному поведению или утечке памяти.std::string позволит избежать всех этих проблем.

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

std::queue <std::string> msgs;

int main()
{

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

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

return 1;
}

Если это всего лишь 5 стандартных сообщений, тогда const char* будет неплохим выбором, но если они всегда являются одинаковыми сообщениями, вам следует рассмотретьочередь целых чисел, которые ссылаются на сообщение, которое вы хотите.Таким образом, вы можете связать больше действий с ним.Но чем вы могли бы также рассмотреть очередь объектов.

#include <iostream>
#include <queue>

std::queue <int> 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 голосов
/ 07 декабря 2011

msg - это массив, а не тип. А поскольку массивы не могут быть скопированы, это все равно не сработает. Почему бы не std::queue<std::string> вместо этого?

0 голосов
/ 07 декабря 2011

Прежде всего, вам нужно поставить знак «#» перед оператором включения.

Во-вторых, когда вы объявляете очередь, вы помещаете тип, который хотите, чтобы он содержался, в угловых скобках (case 'char *'), а не имя переменной, как "msg".

...