Как индексировать массив указателей на массивы [очередь]? - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь запрограммировать очередь с массивами в C ++.

Я использовал этот подход https://stackoverflow.com/a/936709/7104310, как показано ниже.

Мой вопрос: Как я могу индексировать массивы взаполнить их?

В обычном 2d-массиве это будет, например, arr [3] [2].Но я не знаю, как это сделать с помощью указателей.Вопрос не получил ответа в Решении после.

Спасибо!

#include <iostream>

#define MAX_SIZE 3

using namespace std;


// ary[i][j] is then rewritten as

//arr[rear*capacity + front]

// Class for queue
class msg_queue
{
    char **arr;     // array to store queue elements
    int capacity;   // maximum capacity of the queue
    int front;      // front points to front element in the queue (if any)
    int rear;       // rear points to last element in the queue
    int count;      // current size of the queue

public:
    msg_queue(int size = MAX_SIZE, int slot_length = MAX_SIZE);     // constructor

    void dequeue();
    void enqueue(char x);
    char peek();
    int size();
    bool isEmpty();
    bool isFull();
};

// Constructor to initialize queue
msg_queue::msg_queue(int size, int slot_length)
{
    arr = new char*[size];
    for (int i = 0; i < size; ++i) {
        arr[i] = new char[slot_length];
    }

    capacity = size;
    front = 0;
    rear = -1;
    count = 0;
}

// Utility function to remove front element from the queue
void msg_queue::dequeue()
{
    // check for queue underflow
    if (isEmpty())
    {
        cout << "UnderFlow\nProgram Terminated\n";
        exit(EXIT_FAILURE);
    }

    cout << "Removing " << arr[front] << '\n';

    front = (front + 1) % capacity;
    count--;
}

// Utility function to add an item to the queue
void msg_queue::enqueue(char item)
{
    // check for queue overflow
    if (isFull())
    {
        cout << "OverFlow\nProgram Terminated\n";
        exit(EXIT_FAILURE);
    }

    cout << "Inserting " << item << '\n';

    rear = (rear + 1) % capacity;
    arr[rear] = item;  //ERROR HERE
    count++;
}

// Utility function to return front element in the queue
char msg_queue::peek()
{
    if (isEmpty())
    {
        cout << "UnderFlow\nProgram Terminated\n";
        exit(EXIT_FAILURE);
    }
    return arr[front]; //ERROR HERE
}

1 Ответ

0 голосов
/ 15 января 2019

Ну, это все еще arr[3][2].

Хотя массивы не являются указателями, мы эффективно используем их для эффективного использования указателя из-за того, как они работают, и из-за того, как их имя затухает.

x[y] - *(x+y), по определению.

При этом я бы порекомендовал вам отбросить динамическое распределение 2D (что является вредным для вашего кэша) и создать вместо него один большой блок Ширина & times; Высота char с. Вы можете использовать немного математики для предоставления двумерных индексов по этим данным.

Также вы забыли освободить эту память. Если вы используете хороший std::vector для реализации предложенной мной схемы одномерной передачи данных (или даже если вы нанимаете вектор векторов, но все же!), Тогда он будет уничтожен для вас. Конечно, если бы вы могли это сделать, вы, вероятно, использовали бы std::queue & hellip;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...