C: массив фиксированной длины, который сбрасывает самые старые, сдвигает и добавляет самые новые - PullRequest
0 голосов
/ 26 октября 2018

Мне нужна структура, которая является частью массива и частью очереди фиксированного размера: я хотел бы иметь возможность добавлять число к одному концу, в то время как число на противоположной стороне сбрасывается.В то же время я хотел бы всегда иметь возможность сказать [i] или подобное и получить значение по этому индексу (просто заглянуть, не хлопать!).

Таким образом, прогресс должен выглядеть следующим образом:

a={2,3,4} | append a 5
a={3,4,5} | append a 99 
a={4,5,99}| now ask for a[1], get 5

и т. Д.Есть ли какая-нибудь встроенная в C, которая делает то или иное.аналогичный?

EDIT2: В настоящее время я работаю с чем-то вроде этого, что, очевидно, довольно сильно зависит от реализации, при условии, что операция без знака char 255 + = 1 оценивается в 0:

#include <stdio.h>
#include <limits.h>

unsigned char p =0;   //  helper that provides the current tail of queue
int a[1 << CHAR_BIT]; // array of size 2^[bit-size of helper]

int from_a(unsigned char i) {
    return a[(i+p)];  // addition of helper makes i the true index
}

void append_to_a(int x) {
    a[0]=x;
    p+=1; // rolling-over of unsigned char provides circularity
}

Just outинтерес, а не часть основного вопроса: есть ли другой язык, который имеет это?

РЕДАКТИРОВАТЬ:

Процесс должен быть автоматическим (не нужно добавлять, а затем поп /delete / shift ..) не требуется доступ на запись к существующим элементам (просто чтение, но индексирование).

Спасибо всем, кто ответил, что нет встроенного в C, и предлагал альтернативы.Я реализовал что-то странное, но deque, циклическая очередь / буфер и контейнер были ценными поисковыми терминами.

«Спасибо» всем, уверяющим меня, что в любой среде, полной Тьюринга, это как-то возможно - я бы отчаялся (мой вопрос был о встроенных программах, но знание того, что универсальные компьютеры действительно могут вычислять, довольно утешительно)).

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

C не имеет таких встроенных. Но с контейнером C ++ deque вы можете сделать это легко.

Минимальный пример:

#include <iostream>
#include <deque>

int main()
{
    // Create a deque containing integers
    std::deque<int> d = {1, 2, 3};
    int sizeLimit = 3;
    if(d.size() == sizeLimit)
    {
        d.pop_front(); //remove from front
    }
    d.push_back(4); //add at the end

    // Iterate and print values of deque
    for(int n : d) {
        std::cout << n << '\n';
    }
}

Python имеет collections.deque в своей стандартной библиотеке, которая имеет эту функциональность.

import collections
d = collections.deque(maxlen=3)
print(d)

for i in range(3):
  d.append(i)

print(d)

d.append(3)
print(d)

d.append(4)
print(d)

Вы можете увидеть живое демо здесь .

0 голосов
/ 26 октября 2018

я хотел бы иметь возможность добавить число справа (или слева) в то время как самый старый номер сбрасывается. Так что прогресс должен выглядеть это: [2,3,4], [3,4,5], [4,5,6] и т. д. Есть ли некоторые встроенные в C, которые это что?

Нет, вам нужно реализовать собственную структуру данных.

есть другой язык, который имеет это?

Вы можете легко выполнить такую ​​операцию, используя Deque. В c ++ (STL) или Java (в рамках коллекции) есть своя реализация. Декрет может быть реализован на python с использованием модуля 'collections'.

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