Я думаю, что эти вложенные циклы - это то, что вам нужно
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, чтобы хранить все элементы. Чтобы получить значения, рассчитайте правильный индекс для него, в зависимости от строки (первая или вторая).