Секционирование массивов по индексу

Я довольно новичок в C ++ и пытаюсь решить проблему, которая, кажется, имеет твердое решение, но я просто не могу ее найти. У меня есть непрерывный массив целых, начиная с нуля:

int i[6] = { 0, 1, 2, 3, 4, 5 }; // this is actually from an iterator

Я хотел бы разбить массив на группы по три. Дизайн должен иметь два метода, j а также k, такой что дано i они вернут два других элемента из той же группы из трех. Например:


i j (i) k (i)  
0 1 2
1 0 2
2 0 1
3 4 5
4 3 5
5 3 4

Решение, кажется, включает в себя суммирование i с его значением mod три и плюс или минус один, но я не могу понять логику.

0

Решение

Это должно работать:

int d = i % 3;
int j = i - d + ( d == 0 );
int k = i - d + 2 - ( d == 2 );

или следующее утверждение для k может быть более читабельным:

int k = i - d + ( d == 2 ? 1 : 2 );
1

Другие решения

Это должно сделать это:

int j(int i)
{
int div = i / 3;
if (i%3 != 0)
return 3*div;
else
return 3*div+1;
}

int k(int i)
{
int div = i / 3;
if (i%3 != 2)
return 3*div+2;
else
return 3*div+1;
}

Тестовое задание.

Если вы хотите более короткие функции:

int j(int i)
{
return i/3*3 + (i%3 ? 0 : 1);
}

int k(int i)
{
return i/3*3 + (i%3-2 ? 2 : 1);
}
1

Ну, во-первых, обратите внимание, что

j(i) == j(3+i) == j(6+i) == j(9+i) == ...
k(i) == k(3+i) == k(6+i) == k(9+i) == ...

Другими словами, вам нужно только найти формулу для

j(i), i = 0, 1, 2
k(i), i = 0, 1, 2

а затем для остальных случаев просто подключите i mod 3,

Оттуда у вас будут проблемы с поиском простой формулы, потому что ваше «вращение» не является стандартным. Вместо

i       j(i)    k(i)
0       1       2
1       2       0
2       0       1

для которого формула была бы

j(i) = (i + 1) % 3
k(i) = (i + 2) % 3

у тебя есть

i       j(i)    k(i)
0       1       2
1       0       1
2       0       2

для которого единственная формула, которую я могу придумать на данный момент,

j(i) = (i == 0 ? 1 : 0)
k(i) = (i == 1 ? 1 : 2)
0

Если значения вашего массива (давайте назовем его arrне i во избежание путаницы с указателем i) не совпадают с их соответствующим индексом, вы должны выполнить обратный поиск, чтобы сначала выяснить их индекс. Я предлагаю использовать std::map<int,size_t> или std::unordered_map<int,size_t>,

Эта структура отражает обратную arr и вы можете дополнительно индекс для определенного значения с его индекс оператор или at функция-член. С этого момента вы можете работать только с индексами и использовать по модулю (%) для доступа к предыдущему и следующему элементу, как предлагается в других ответах.

0
По вопросам рекламы [email protected]