Это зависит от того, сколько операций вы будете выполнять и как именно будет реализована версия массива.
Если вы выполняете сравнительно небольшое количество операций, то есть менее 1000 или около того, ставите в очередь / удаляют в общей сложности, тогда массив будет быстрее, потому что он непрерывен в памяти. Сохраняйте указатель на передней панели и указатель на задней части, всегда добавляйте заднюю часть и удаляйте из нее лицевую сторону.
С другой стороны, даже если список не длиннее 30 или более элементов, если он будет сохраняться в течение длительного периода, у вас не возникнет проблем с изменением размера массива, что является потенциальной проблемой с массивом.
Связанный список гарантирует отличную производительность, массив, который вы должны следить за изменением размера.
EDIT:
Как упомянул @Hans Passant, массивы бывают быстрыми, потому что имеют локальность кэша процессора. Пока ваш массив небольшой, ваше оборудование будет оптимизировать производительность, так что память, связанная с хранением массива, будет храниться в вашем L2. Индексы скорее всего в регистрах. Это действительно быстро. Судя по тому, что вам не нужно много элементов, в этом случае массив будет идеальным. И да, вам придется изменять индексы при перемещении элементов, но на самом деле это очень быстрая операция, поскольку, если вы строите код с оптимизацией, индексы будут храниться в регистраторах.
Здесь есть одна загвоздка, вы упомянули, что вам, возможно, придется одновременно выполнять и постановку в очередь, и удаление из очереди, то есть вы подразумеваете, что она параллельна, то есть несколько потоков обращаются к памяти? Если это так, массивы все равно будут быстрее, но вы увидите примерно 800-кратное снижение производительности. Зачем? потому что процессор больше не может буферизовать память, связанную с вашей очередью, на матрице, но она должна храниться в основной памяти. Кроме того, вы рискуете создать состояние гонки между потоками. Представьте, что если один поток попытался удалить из очереди, а другой попытался поставить в очередь, и в списке был только один элемент, вы можете потерпеть неудачу. В любом случае, если это приложение ориентировано на производительность, обязательно скомпилируйте (при условии gcc) с включенными флагами NDEBUG и -O3.
Второе редактирование:
Посмотрев на код и посмотрев ниже на другие ответы, я бы посоветовал сделать код массива более эффективным и превратить его в круговой массив, поскольку он звучит так, как будто у вас есть верхняя граница числа элементов. Напомним, что текущая реализация массива крайне неэффективна: каждый раз, когда вы удаляете, вы копируете вперед оставшуюся часть очереди, это не имеет смысла, просто увеличивайте указатель int на «первый» индекс.
Псевдокод:
int ciruclarArray[SIZE];
int front = 0;
int back = 0;
void enqueue(int elem)
{
circularArray[back] = elem;
if(back < (circularArray.length - 1))
back++;
else
back = 0;
return elem;
}
int dequeue()
{
int toReturn = circularArray[front];
//do same check for incrementing as enqueue
return toReturn;
}
только не забудьте выполнить проверку ошибок для нормальных вещей.