Добавление нового оператора каждой итерации a для l oop. Очередь с двумерным массивом - PullRequest
2 голосов
/ 24 марта 2020

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

Последняя функция примет std :: string.

Я написал довольно ужасный c код ... в конце концов. Я искал шаблон, но меня привлекает то, что каждый раз, когда число перемещается по очереди, ему требуется еще одна строка кода, и оно должно переходить к следующему элементу в массиве.

Я полагаю, что смогу сделать это, я могу поместить это в al oop.

, так что вы в основном добавляете другую строку кода каждый раз, когда он добавляет новое число из итератора.

intarray[0][0] = *it;
    ++it;
    intarray[0][1] = intarray[0][0];

    intarray[0][0] = *it;
    ++it;
    intarray[0][2] = intarray[0][1];
    intarray[0][1] = intarray[0][0];

    intarray[0][0] = *it;
    ++it;
    intarray[0][3] = intarray[0][2];
    intarray[0][2] = intarray[0][1];
    intarray[0][1] = intarray[0][0];

    intarray[0][0] = *it;
    ++it;
    intarray[0][4] = intarray[0][3];
    intarray[0][3] = intarray[0][2];
    intarray[0][2] = intarray[0][1];
    intarray[0][1] = intarray[0][0];

    intarray[0][0] = *it;
    ++it;
    intarray[0][5] = intarray[0][4];
    intarray[0][4] = intarray[0][3];
    intarray[0][3] = intarray[0][2];
    intarray[0][2] = intarray[0][1];
    intarray[0][1] = intarray[0][0];

    intarray[0][0] = *it;
    ++it;
    intarray[0][6] = intarray[0][5];
    intarray[0][5] = intarray[0][4];
    intarray[0][4] = intarray[0][3];
    intarray[0][3] = intarray[0][2];
    intarray[0][2] = intarray[0][1];
    intarray[0][1] = intarray[0][0];

числа go вниз каждый раз, когда новое число добавляется от итератора

1 Ответ

1 голос
/ 25 марта 2020

Я думаю, что эти вложенные циклы - это то, что вам нужно

auto jj = 1u;
while (!condition)
{
    intarray[0][0] = *it;
    ++it;
    for (auto ii=jj; ii >= 1 ; --ii)
        intarray[0][ii] = intarray[0][ii-1];
    ++jj;
}

, где condition - это любое условие, когда вам нужно остановить процесс.
Однако этот код не очень эффективен.


РЕДАКТИРОВАТЬ
Как я понимаю, вам нужно использовать оба измерения, поэтому у вас есть варианты:
a) , если вы знаете размер вашего данные заранее, и я думаю, что это так, поскольку вы используете статически размещенные intarray[N][M]:

for (auto kk=N-1; 0 <= kk; --kk)
    for (auto ii=M-1; 0 <= ii ; --ii)
        {
            intarray[kk][ii] = *it;
            ++it;
        }

, вы просто заполняете массив в обратном порядке, и нет необходимости перезаписывать значения много раз.

b) , если вы заранее не знаете размер, но у вас достаточно памяти (и времени): заполните контейнер динамического размера (я бы рекомендовал std::vector<int>) данными и go маршрут а)

c) , если вы не знаете размер заранее и у вас недостаточно памяти для хранения временного контейнера, вы не можете использовать статически распределенный массив. Единственное решение, которое я вижу, это заполнить данные std::vector<T>, а затем написать функцию-обертку, чтобы элементы находились в правильном порядке.


EDIT2: В соответствии с изображением Вы разместили в комментарии, вам нужна простая обертка вокруг массива. Отказ от ответственности: я не тестировал приведенный ниже код, тем не менее, он должен работать, возможно, после незначительных настроек.

//while you can do it without class, I prefer this way
class MyArray
{
public:
    //push value in the array
    void push_back(const int a)
    {
        //move values using std::memmove as suggested above 
        std::memmove(&(arr[1]),&(arr[0]),2*N - 1);
        //store first element
        arr[0]=a;
    }

    //calculate index in array and return
    int at(const int a, const int b)
    {
        if (0 == a) //first row
            return arr.at(b); //return just the index
        if (1 == a) //second row
            return arr.at(N - 1 - b); //if 
    }
private:
    //dimension of the array
    static const int N = 10;
    //contiguous static array is enough here
    //one can use C-style array, but no point for doing so
    std::array<int, 2*N> arr;
}

//usage
MyArray mArr;

while(!condition)
{
    mArr.push_back(*it);
    std::cout<<mArr.at(1,2)<<std::endl;
}

Для «перемещения очереди» удобно использовать std::memmove, как предложено Какой-то программист чувак . Поскольку std::memmove работает над непрерывной памятью, используйте массив std::array, std::vector или 1D C в стиле вместо массива 2D C, чтобы хранить все элементы. Чтобы получить значения, рассчитайте правильный индекс для него, в зависимости от строки (первая или вторая).

...